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

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

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

这个问题具体是关于使用容器视图的

有帮助吗?

解决方案

我不确定你的意思是“检索嵌入式控制器”。当您想使用控制器时,您使用uistoryboard方法InstantiativeViewControllerWithIdentifier :,使用您在IB中的控制器中的标识符。您还可以使用performseguewith identifier:sender:方法(也可以实例化视图控制器)。您应该在Apple文档中查看“应用程序中使用视图控制器”部分。它还参考子视图控制器与容器控制器同时实例化。

编辑后:如果在另一个视图控制器中将容器视图嵌入,则可以从包含self.childViewControllers(这将是一个数组的包含控制器中引用该嵌入式视图的控制器(所以如果只有一个,则可以获得它使用lastobject)。

其他提示

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

例如,如果我有一个 UINavigationController 嵌入在一个 CustomContainerViewController, ,我可以命名嵌入转场 embedContentStack 在故事板中并将其捕捉到 CustomContainerViewController 通过

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"embedContentStack"]) {
        // can't assign the view controller from an embed segue via the storyboard, so capture here
        _contentStack = (UINavigationController *)segue.destinationViewController;
    }
}

注意小心的

在进行之前使用回答这个问题,你可能希望反映是否嵌入的事情真正需要的是看法控制器。

例如,如果你是嵌入 UICollectionViewController 子类,你能不能代替嵌入一个 UICollectionView 类?或者,甚至是更好的,你能不能嵌入一个 UIView 子类,它隐藏掉 UICollectionView 后面一个简单的模型?

在代码基地目前,我正在工作上,我是嵌入两个图控制器在另一种看法控制器。两者可以相当容易被普通的意见相反,并然后可以更容易地定,在情节提要,没有这种杂乱的代码。

不幸的是,他们目前看的控制器和我不在一个位置,以简化它们在普通意见的权利,所以这将不得不这样做。

背景

我使用的方法收拾嵌入"继续"在 prepare(for segue:, sender:) 作为建议通过 俏皮的怪胎 在这里。

我想告诉swift我使用对于这一点,因为这似乎是相当整洁的...

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
        }
    }
}

讨论

我选择 名字继续作为行动的方法.

使用 enum 情况继续符意味着你已经有了编译器和工具在你的一边,使其更难以获得继续的名字是错误的。

保持"继续"ids在 private enumextension 范围似乎是适当的,在这种情况下,因为这些继续不需要任何其他地方(他们不能 performed,例如)。

我用隐含地展开类型,用于嵌入式的视图控制器,因为(在我的情况下,无论如何)它的逻辑错误,如果他们失踪。

同样,我也很乐意力投目的地的图控制器类型。再次,这将是一个逻辑错误,如果这些类型是不同的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top