如何从嵌入的子UIViewController中获取父UIViewController引用?
获取Container View子控制器中父视图控制器的引用
嘿,这个问题其实有几种靠谱的解决办法,我来给你详细说说:
方法一:直接用系统原生的parent属性(最推荐)
iOS已经帮我们做好了基础工作,只要你的子控制器是通过Container View正确嵌入到父控制器中的,直接在子控制器里访问self.parent就能拿到父控制器的引用。
举个Swift代码例子:
// 子UIViewController内部代码 if let parentVC = self.parent as? YourParentVCType { // 这里就可以调用父控制器的方法、访问属性了 parentVC.updateSomeData() }
如果是用Objective-C的话:
// 子UIViewController内部代码 YourParentVCType *parentVC = (YourParentVCType *)self.parent; if (parentVC) { [parentVC updateSomeData]; }
这种方式最简洁,也符合iOS的设计逻辑,优先用它就对了。
方法二:手动传递引用(更可控)
如果你需要更明确的控制,或者要在初始化子控制器的时候传递额外信息,可以在父控制器里手动把自身引用传给子控制器。
步骤:
- 先在子控制器里定义一个弱引用属性(避免循环引用!):
// 子控制器代码 weak var customParentVC: YourParentVCType?
Objective-C版本:
// 子控制器头文件 @property (nonatomic, weak) YourParentVCType *customParentVC;
- 然后在父控制器的
prepare(for:sender:)方法里,找到对应的子控制器并赋值:
// 父控制器代码 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 记得给Container View的segue设置唯一标识符 if segue.identifier == "ContainerSegueID" { if let childVC = segue.destination as? YourChildVCType { childVC.customParentVC = self } } }
Objective-C版本:
// 父控制器代码 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"ContainerSegueID"]) { YourChildVCType *childVC = (YourChildVCType *)segue.destinationViewController; childVC.customParentVC = self; } }
几个重要注意点
- 优先用
parent属性,这是系统原生支持的,减少自定义代码的维护成本。 - 手动传递引用时必须用
weak修饰,不然父控制器和子控制器会互相持有,导致内存泄漏。 - 如果是通过代码手动添加子控制器(不是Storyboard的Container View),添加时直接给子控制器的自定义属性赋值即可,同样也能使用
parent属性。
内容的提问来源于stack exchange,提问作者Muddassir Ahmed
相关产品推荐
相关产品推荐

