一个 UIViewController 子类,可以用作位于独立 Storyboard 中的另一个视图控制器的代理。在运行时,代理视图控制器将被适当替换。
在 Interface Builder 中使用 Storyboards 进行工作的时候,随着越来越多的视图控制器被添加,Storyboard 有可能变得非常大。在许多情况下,这会在 Xcode 中引起性能问题,对开发者的导航造成问题,并且在团队中协同工作时会发生合并冲突。
该项目旨在通过允许开发人员通过代理视图控制器链接到独立的 Storyboard 来解决这个问题,并且运行时用期望的目标视图控制器替换这些代理。
在此演示应用程序中,使用 GRKStoryboardProxyViewController
将应用程序在不同边界处分割成多个 Storyboard 文件。每个 UITabBarController 的标签页都有故事的 storyboard。两个不同的视图控制器各自的 storyboard 也通过主界面中的 segue 来展示。
如果您使用 CocoPods,只需将其添加到您的 Podfile
中即可
pod 'GRKStoryboardProxy'
否则,只需将 GRKStoryboardProxy
子目录的内容添加到您的项目中。
要使用,请在父 Storyboard 中创建一个 UIViewController,将类设置为 GRKStoryboardProxyViewController
,配置代理以指向您希望的目标 Storyboard 和视图控制器,然后将其连接到您的应用程序的其余部分,就像它是要目标视图控制器一样。
注意:在运行时,代理将被您指定的视图控制器完全替换。这很重要,因为任何对代理的更改都不会应用到最终的视图控制器。这些更改需要在自身 storyboard 中的实际视图控制器上做出。
通过使用视图控制器的 restorationIdentifier
属性来配置代理。
此类配置元数据应位于此代理实例的 Restoration Identifier 中,其格式如下:
[<sceneIdentifier>@]<storyboardName>[#<storyboardBundleIdentifier>]
其中
sceneIdentifier
是在 storyboard 中表示的由 storyboardName
代号的 target 场景的可选标识符。如果没有提供,我们将在 storyboard 中使用初始视图控制器。storyboardName
是外部 storyboard 的文件名(减去 .storyboard
后缀)。storyboardBundleIdentifier
是一个可选的包标识符,用于定位所指定的演示文稿。如果未提供,我们将假设演示文稿位于主包中。例如:您可以在 Interface Builder 中指定此代理实例的元数据为 "GRKMyFancyViewController",然后我们会尝试从主包中名为 "GRKMyFancyViewController.storyboard" 的演示文稿文件中加载初始视图控制器。
更多文档可以在 GRKStoryboardProxyViewController.h
中找到,示例用法可以在 GRKStoryboardProxyViewControllerTestApp
中找到。
awakeAfterUsingCoder:
加载的备用演示文稿返回视图控制器时的问题。我的方法和他的方法几乎相同,他的工作早于我。我是 Levi Brown,一名白天做专业 iOS 工程师的工程师。我是博客 grokin.gs 的作者,可通过以下方式联系我:
Twitter @levigroker
App.net @levigroker
Email [email protected]
欢迎您提出建设性的评论和反馈。