我有一个复杂的iPad视图,我通过拥有多个视图控制器进行管理。我以前(在iOS6 / XCode 4.5之前)通过在代码中分配我的视图控制器来实现这一点,并通过指向主视图的链接将各种视图连接到它们。
我想要做的是使用新的容器视图将视图控制器嵌入到storyboard文件中。我似乎无法将嵌入式视图控制器的IBOutlet链接到主控制器。
有可能这样做吗?或者通过标签或代码中的某些内容检索嵌入式控制器?
这个问题特别关于使用容器视图
答案 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
)。
我正在为嵌入式视图控制器使用隐式展开类型,因为(无论如何)如果它们丢失,则是一个逻辑错误。
同样,我也很乐意强制转换目标视图控制器类型。同样,如果这些类型不相同,那将是一个逻辑错误。