你能在Storyboard中将子视图控制器关联到自定义容器视图控制器吗?
我可以将子视图控制器链接到标签视图控制器,也可以将一个视图控制器链接到导航控制器。
如何使容器视图控制器接受子视图控制器?
你能在Storyboard中将子视图控制器关联到自定义容器视图控制器吗?
我可以将子视图控制器链接到标签视图控制器,也可以将一个视图控制器链接到导航控制器。
如何使容器视图控制器接受子视图控制器?
结合了Caleb和Matt的回答,我做了以下操作:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"cpdc_check_embed"]) {
self.checkVC = segue.destinationViewController;
}
}
...其中checkVC
是容器控制器上的一个属性:
@property (weak,nonatomic) PXPCheckViewController * checkVC;
你只需要将embed
转场的Storyboard ID
设置为你想要的任何名称(在这种情况下,为cpdc_check_embed
):
...然后在-prepareForSegue:sender:
中检查标识符。
虽然不是输出口(outlet),但比Matt的(在我看来)更干净,比Caleb的更具体,并且你仍然可以得到一个好看的故事板:
对象
出口到容器视图控制器场景中来创建对子视图控制器的引用,然后将它们的类类型指定为子视图控制器类的实例。
为了像苹果内置容器那样在不同场景中保持子视图分开,我们将使用一个不同的技巧。首先,假设我们在容器类ContainerViewController
中声明了以下属性:@property (nonatomic, strong, readwrite) UIViewController *leftViewController;
@property (nonatomic, strong, readwrite) UIViewController *rightViewController;
identifier
属性设置为"cvc_leftViewController"
(“cvc_”指ContainerViewController
,但实际上标识符可以是任何你想要的)。对于右侧视图控制器的场景也做同样的操作,将其标识符设置为"cvc_rightViewController"
。ContainerViewController
的viewDidLoad
方法中:if (self.storyboard) {
_leftViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_leftViewController"];
_rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"cvc_rightViewController"];
}
ContainerViewController
时,它会从各自的场景中获取“left”和“right”视图控制器,并通过其属性设置对它们的引用。现在您可以控制子视图控制器实例,可以随意设置父/子关系。要了解如何正确地执行此操作,请参阅UIViewController文档。iOS 5允许多个视图控制器在同一个场景中活动(虽然应该仍有一个主控制器),因此故事板中的单个场景可能具有多个控制器。您可以使用输出口将这些控制器连接起来,并且可以像在IB中一样配置这些连接:在同一场景中从一个控制器向另一个控制器进行控制拖动。通常的输出口列表将弹出,以便您选择要连接的输出口。
在一个场景中使用多个控制器的关键(我相信你想要的是这个)是使用IB中对象列表中的神秘对象来表示其他视图控制器并连接其输出口。
这个答案如何在iOS 5中使用storyboard创建自定义视图控制器容器应该会有所帮助。该答案还提供了一个非常有用的实例应用程序。
self.left.data = [
"Zombie ipsum reversus ab viral inferno, nam rick grimes malum cerebro.",
"De carne lumbering animata corpora quaeritis." ]
在此,left
的定义如下:
lazy var left:CollectionViewController = { [unowned self] in
return self.childViewControllerWithId("Left") as! CollectionViewController }()
而childViewControllerWithId
的定义如下:
extension UIViewController {
func childViewControllerWithId(rid:String) -> UIViewController? {
// check immediate child controllers
for vc in self.childViewControllers as! [UIViewController] {
if vc.restorationIdentifier == rid { return vc }
}
// check nested controllers
for vc in self.childViewControllers as! [UIViewController] {
if let vc = vc.childViewControllerWithId(rid) {
return vc
}
}
assert(false, "check your assumptions")
return nil
}
}
find
变体。还要注意,上述内容要求您在Storyboard文件中定义还原ID。如果您没有重复的视图控制器实例,则使用类型会更容易。find(...)
即可。