IBOutlet 链接到嵌入式视图控制器
-
12-12-2019 - |
题
我有一个复杂的 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;
}
}
这里是另一个关于它的线程:来自父iOS的访问容器视图控制器
注意小心的
在进行之前使用回答这个问题,你可能希望反映是否嵌入的事情真正需要的是看法控制器。
例如,如果你是嵌入 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 enum
内 extension
范围似乎是适当的,在这种情况下,因为这些继续不需要任何其他地方(他们不能 perform
ed,例如)。
我用隐含地展开类型,用于嵌入式的视图控制器,因为(在我的情况下,无论如何)它的逻辑错误,如果他们失踪。
同样,我也很乐意力投目的地的图控制器类型。再次,这将是一个逻辑错误,如果这些类型是不同的。