【问题标题】:Why is superview returning nil? [duplicate]为什么superview返回零? [复制]
【发布时间】:2026-01-10 20:00:02
【问题描述】:

在最底部是我的代码,其中 MainController 启动了一个名为 setController 的子视图。但是,在 setController 的代码中,当我尝试使用超级视图时,我得到了一个 nil:

override func viewDidLoad() {
    super.viewDidLoad()
    print(self.view.superview ?? "no parent")
}

我将第二个视图指定为子视图,但显然我遗漏了一些东西。我是否误解了 UIView 层次结构的工作原理?

class MainController: UIViewController {
    
    private lazy var setController = SetController()
    var invButton   : MyButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        invButton = makeButton(vControl: self, btype: ButtType.inv, action: #selector(self.buttonAction(sender:)))
        invButton.frame.origin.x = self.view.frame.width * 0.1
        invButton.frame.origin.y = self.view.frame.height * 0.1
        invButton.setTitle("Settings", for: .normal)
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }
    
    @objc func buttonAction(sender: UIButton!) {
        guard let theButton = sender as? MyButton else { return}

        UIView.transition(with: self.view, duration: 0.5, options: .transitionCurlDown, animations: { [self] in
          self.view.addSubview(setController.view)
        }, completion: nil)
    }
}

【问题讨论】:

标签: swift


【解决方案1】:

对于遇到此问题的任何人,我都在这里找到了答案:

https://guides.codepath.com/ios/Adding-and-Removing-Child-View-Controllers

我的错误是我没有意识到添加子视图是一个多行过程。

所以 self.view.addSubview(setController.view) 变成了:

addChild(setController);
view.addSubview(setController.view);
setController.didMove(toParent: self);

【讨论】:

    最近更新 更多