在iOS6中,我注意到新的容器视图,但不太确定如何从包含视图访问它的控制器。
场景:
我想从包含容器视图的视图控制器中访问Alert视图控制器中的标签。
它们之间有一个segue,我能用吗?
在iOS6中,我注意到新的容器视图,但不太确定如何从包含视图访问它的控制器。
场景:
我想从包含容器视图的视图控制器中访问Alert视图控制器中的标签。
它们之间有一个segue,我能用吗?
当前回答
你可以简单地使用self.childViewControllers.lastObject(假设你只有一个子对象,否则使用objectAtIndex:)。
其他回答
是的,你可以使用segue来访问子视图控制器(及其视图和子视图)。使用Storyboard中的Attributes检查器给segue一个标识符(比如alertview_embed)。然后让父视图控制器(包含容器视图的控制器)实现如下方法:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"alertview_embed"]) {
AlertViewController * childViewController = (AlertViewController *) [segue destinationViewController];
AlertView * alertView = childViewController.view;
// do something with the AlertView's subviews here...
}
}
你可以简单地使用self.childViewControllers.lastObject(假设你只有一个子对象,否则使用objectAtIndex:)。
prepareForSegue方法有效,但它依赖于segue标识符魔术字符串。也许有更好的办法。
如果你知道你要找的VC的类,你可以用一个计算属性很好地做到这一点:
var camperVan: CamperVanViewController? {
return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
// This works because `flatMap` removes nils
}
这依赖于childViewControllers。虽然我同意依赖第一个类可能很脆弱,但命名您所寻找的类会使这个类看起来相当可靠。
你可以这样写
- (IBAction)showDetail:(UIButton *)sender {
DetailViewController *detailVc = [self.childViewControllers firstObject];
detailVc.lable.text = sender.titleLabel.text;
}
}
使用generic,你可以做一些甜蜜的事情。下面是Array的扩展:
extension Array {
func firstMatchingType<Type>() -> Type? {
return first(where: { $0 is Type }) as? Type
}
}
你可以在你的viewController中这样做:
var viewControllerInContainer: YourViewControllerClass? {
return childViewControllers.firstMatchingType()!
}