ios - UIViewController.addChild() 是如何工作的

标签 ios swift

当我在另一个 View Controller 中添加 ViewController 时,我应该 addChild,没有这个,它不起作用

@objc func openMenuHandler() {
        let menuController = MenuController()
        menuController.view.frame = CGRect(x: -menuWidth, y: 0, width: menuWidth, height: self.view.frame.height)
        
        let keyWindow = UIApplication.shared.windows.filter({$0.isKeyWindow}).first
        keyWindow?.addSubview(menuController.view)
        
        addChild(menuController) // I should add this line to display UITableViewController properly
}
但是如果我在类范围内初始化 UITableViewController,它可以工作 没有 addChild 方法
    let menuController = MenuController() // this line in UIViewController class scope


    @objc func openMenuHandler() {
        self.menuController.view.frame = CGRect(x: -menuWidth, y: 0, width: menuWidth, height: self.view.frame.height)
        
        let keyWindow = UIApplication.shared.windows.filter({$0.isKeyWindow}).first
        keyWindow?.addSubview(self.menuController.view)
    }

最佳答案

顺便说一句,除了简单的“确保 subview Controller 没有被释放”之外,addChild有更深层次的目的,确保将相关 View Controller 添加到 View Controller 层次结构中,作为“ View Controller 包含”API 的一部分。确保在 subview Controller 上调用各种与外观相关的方法(例如 viewDidAppear 、旋转事件等)。如the documentation说, View Controller 包含调用,“允许 iOS 正确地将事件路由到 subview Controller 和这些 Controller 管理的 View 。”

顺便说一句,正确的顺序是:

  • addChild subview Controller 到父 View Controller 的 subview ;
  • 将 subview Controller 的 View 添加到其父 View 的层次结构中;和
  • 调用 child.didMove(toParent:self) 告诉 child 它已被添加到父 View Controller 中。

  • 如果必须删除 subview ,则顺序为:
  • 调用 child.willMove(toParent: nil) 告诉 child 它将从 parent 的 View Controller 中删除。
  • 从其父 View 层次结构中删除 subview Controller 的 View ;和
  • 调用 removeFromParent 在 subview Controller 上完成该过程。
  • 关于ios - UIViewController.addChild() 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62724841/

    相关文章:

    ios - 强制导航栏为状态栏添加空间

    iOS:UIView 是否保留对其 UIViewController 的引用?

    iOS Swift 将 2 个或更多 UITableView 放入带有数据源和委托(delegate)的 UIScrollView 中时出现问题

    ios - 无法点击 UITableView 中的红色减去删除按钮

    ios - 从 SCNScene url 获取下载进度

    ios - 为什么UIViewController中有一个navigationItem?

    swift - 如何在开发中禁用 swift-Mixpanel?

    iphone - 我怎样才能在 obj c 中实现这种智能搜索

    ios - FIRDataBaseReference 未被识别

    ios - AVSpeechSynthesizer 需要在重新开始之前完成