Ada*_*ite 198 objective-c uiviewcontroller ios uicontainerview swift
在iOS6中,我注意到了新的Container View,但我不太确定如何从包含视图访问它的控制器.
场景:
我想从容纳容器视图的视图控制器访问Alert视图控制器中的标签.
它们之间有一个区别,我能用它吗?
Pet*_*r E 360
是的,您可以使用segue访问子视图控制器(及其视图和子视图).alertview_embed
使用Storyboard中的Attributes检查器为segue指定标识符(例如).然后让父视图控制器(容纳容器视图的那个)实现这样的方法:
- (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...
}
}
Run Code Online (Sandbox Code Playgroud)
rde*_*mar 55
您可以简单地使用self.childViewControllers.lastObject
(假设您只有一个孩子,否则使用objectAtIndex:
).
Sru*_*Suk 24
用于Swift编程
你可以写这样的
var containerViewController: ExampleViewController?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// you can set this name in 'segue.embed' in storyboard
if segue.identifier == "checkinPopupIdentifierInStoryBoard" {
let connectContainerViewController = segue.destinationViewController as ExampleViewController
containerViewController = connectContainerViewController
}
}
Run Code Online (Sandbox Code Playgroud)
Sim*_*lGy 17
该prepareForSegue
方法有效,但它依赖于segue标识符魔术字符串.也许有更好的方法.
如果你知道你所追求的VC的类,你可以非常巧妙地使用计算属性:
var camperVan: CamperVanViewController? {
return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
// This works because `flatMap` removes nils
}
Run Code Online (Sandbox Code Playgroud)
这取决于childViewControllers
.虽然我同意依靠第一个可能很脆弱,但是你所寻找的课程命名使它看起来非常可靠.
Swift 3的更新答案,使用计算属性:
var jobSummaryViewController: JobSummaryViewController {
get {
let ctrl = childViewControllers.first(where: { $0 is JobSummaryViewController })
return ctrl as! JobSummaryViewController
}
}
Run Code Online (Sandbox Code Playgroud)
这只会迭代子列表,直到达到第一个匹配.
self.childViewControllers
当你需要来自父母的控制时更相关.例如,如果子控制器是一个表视图,并且您想要通过按钮点击或父视图控制器上的任何其他事件强制重新加载它或更改属性,则可以通过访问ChildViewController的实例而不是通过prepareForSegue来完成.两者都以不同的方式应用.
归档时间: |
|
查看次数: |
88822 次 |
最近记录: |