故事板中视图控制器之间的共享实例

Posted

技术标签:

【中文标题】故事板中视图控制器之间的共享实例【英文标题】:Shared instance between view controllers in storyboard 【发布时间】:2013-10-28 14:32:06 【问题描述】:

我有一个纵向和横向的应用程序。在情节提要中,我有两个视图控制器,都使用相同的子类“genericVC”,以及一个作为初始视图控制器的根视图控制器。

当应用程序启动时,rootVC 将实例化两个控制器并根据检测到的方向推送其中一个。我使用下面的方法(rootVC - ViewDidLoad)实例化它们。

    self.landscapeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"iPadLandscapeVC"];
    self.portraitVC = [self.storyboard instantiateViewControllerWithIdentifier:@"iPadPortraitVC"];

我需要在 self.landscapeVC 和 self.portraitVC 之间以某种方式共享我的 genericVC 类的实例,因此我不需要在每次旋转设备时在它们之间移动数据。

请告诉我怎么做。

谢谢, 卡林

【问题讨论】:

那你为什么有 2 个实例呢? 因为布局有点复杂,我无法使用自动布局进行管理。一个视图垂直滑动,另一个水平滑动一些子视图。 也许这会在情节提要之外更好地处理。创建一个控制器并让它根据方向以不同的方式加载/配置视图。故事板不是魔法或必需的工具... 我的应用程序有大量的按钮和子视图,如果无法在故事板或 xib 中使用共享实例,那么在代码中管理所有这些按钮和子视图会有点困难,我可能会实现一个方法来设置/更新每次旋转时所有的属性和实例变量。 它将与 XIB 一起使用,因为控制器是所有者。故事板的问题在于控制器是用视图实例化的。 【参考方案1】:

您想要一个具有两个视图(纵向和横向)的视图控制器。

您可以添加额外的 nib,或者如果您正在使用 StoryBoard,则可以在 storyBoard 中添加额外的视图控制器,但是给两个 StoryBoard 视图控制器的 nib 相同但 viewController 类。

如果您在创建 StoryBoard 时不小心在纵向和横向之间切换,这会造成一些麻烦,而且您一次只能访问一个。您必须拖出一个,然后拖入一个才能切换您正在处理的一个

Apple 有一个示例应用程序 https://developer.apple.com/library/ios/samplecode/AlternateViews/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008755

【讨论】:

【参考方案2】:

那么您需要的是一个可以在应用程序生命周期中随时访问的单例。我不会推荐它,因为它会在整个应用程序生命周期中一直保留在内存中,并且会消耗您当时可能不会使用的资源。

但由于您不想在视图控制器实例之间使用属性共享信息,我建议您阅读此内容。

https://developer.apple.com/library/ios/documentation/general/conceptual/DevPedia-CocoaCore/Singleton.html

另一个可能的解决方案是使用通知或委托在视图控制器之间发送字典。

希望对你有帮助

【讨论】:

谢谢,这是我正在寻找的概念,问题是如何在我的场景中实现它。 您的 genericVC 将是一个包含变量的单例,然后您将在任何地方访问这些变量作为 '[GenericVC sharedInstance].variable;'甚至将值分配为 '[GenericVC sharedInstance].variable = something;'

以上是关于故事板中视图控制器之间的共享实例的主要内容,如果未能解决你的问题,请参考以下文章

从 ipad 故事板中的视图控制器控制拖动到工具栏而不是自动滚动故事板

如何找到故事板制作的视图控制器实例

在故事板中使用 UIPageViewController

iOS - 故事板中的导航控制器

从 AppDelegate 转到 navigationcontroller 故事板中的详细视图

故事板中 didselectrowatindexpath 上的 Pushview