You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌入的子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的设计逻辑,优先用它就对了。

方法二:手动传递引用(更可控)

如果你需要更明确的控制,或者要在初始化子控制器的时候传递额外信息,可以在父控制器里手动把自身引用传给子控制器。

步骤:

  1. 先在子控制器里定义一个弱引用属性(避免循环引用!):
// 子控制器代码
weak var customParentVC: YourParentVCType?

Objective-C版本:

// 子控制器头文件
@property (nonatomic, weak) YourParentVCType *customParentVC;
  1. 然后在父控制器的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:10:22