IBOutlet链接到嵌入式视图控制器

时间:2012-10-01 15:49:45

标签: ios storyboard xcode4.5

我有一个复杂的iPad视图,我通过拥有多个视图控制器进行管理。我以前(在iOS6 / XCode 4.5之前)通过在代码中分配我的视图控制器来实现这一点,并通过指向主视图的链接将各种视图连接到它们。

我想要做的是使用新的容器视图将视图控制器嵌入到storyboard文件中。我似乎无法将嵌入式视图控制器的IBOutlet链接到主控制器。

有可能这样做吗?或者通过标签或代码中的某些内容检索嵌入式控制器?

这个问题特别关于使用容器视图

4 个答案:

答案 0 :(得分:69)

某些情况的另一个选择是使用-prepareForSegue:sender:捕获嵌入式控制器。

例如,如果我在UINavigationController中嵌入CustomContainerViewController,我可以在故事板中命名嵌入segue embedContentStack并通过<{1}}将其捕获

CustomContainerViewController

答案 1 :(得分:21)

我不确定你的意思是“检索嵌入式控制器”。如果要使用控制器,请使用UIStoryboard方法instantiateViewControllerWithIdentifier:,使用您在IB中为控制器提供的标识符。您还可以使用performSegueWithIdentifier:sender:方法(它还实例化视图控制器)。您应该查看Apple文档中的“在应用程序中使用视图控制器”部分。它还引用了子视图控制器与容器控制器同时实例化的事实。

编辑后:如果在另一个视图控制器中嵌入容器视图,那么嵌入视图的控制器可以从包含控制器的self.childViewControllers(它将是一个数组)中引用,所以如果只有一个,你可以得到它with lastObject)。

答案 2 :(得分:2)

以下是关于它的另一个主题:Access Container View Controller from Parent iOS

他们建议在prepareForSegue中保留引用或在self.childViewControllers中搜索嵌入的viewController

答案 3 :(得分:0)

注意事项

在继续使用此问题的答案之前,您可能希望反映嵌入的内容是否真的需要是视图控制器。

例如,如果您要嵌入UICollectionViewController子类,是否可以嵌入UICollectionView子类?或者,更好的是,您是否可以嵌入一个UIView子类来隐藏简单ViewModel背后的UICollectionView

在我目前正在处理的代码库中,我将两个视图控制器嵌入到另一个视图控制器中。两者都可以很容易地成为普通的视图,然后可以更容易地绑定到故事板中,没有这个混乱的代码。

不幸的是,它们目前是视图控制器,我现在无法将它们简化为普通视图,因此必须这样做。

背景

我正在使用prepare(for segue:, sender:)中的class EditionLandingViewController: UIViewController { fileprivate var titlesView: SectionTitlesViewController! fileprivate var sectionsView: SectionsViewController! } //MARK:- extension EditionLandingViewController { private enum SegueId: String { case embedTitles case embedSections } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { super.prepare(for: segue, sender: sender) guard let segueRawId = segue.identifier, let segueId = SegueId(rawValue: segueRawId) else { return } switch segueId { case .embedTitles: self.titlesView = segue.destination as! SectionTitlesViewController case .embedSections: self.sectionsView = segue.destination as! SectionsViewController } } } 提取嵌入segue的方法,如Playful Geek所示。

我想展示我正在使用的快速,因为它看起来相当整洁......

enum

讨论

我选择了name segues as action methods

对segue标识符使用private enum个例子意味着您已经拥有了编译器和工具,因此更难以获得segue名称。

在这种情况下,将extension范围内的segue ID保持在perform似乎是合适的,因为在其他地方不需要这些segues(例如,它们不能with )。

我正在为嵌入式视图控制器使用隐式展开类型,因为(无论如何)如果它们丢失,则是一个逻辑错误。

同样,我也很乐意强制转换目标视图控制器类型。同样,如果这些类型不相同,那将是一个逻辑错误。