仅在插入断点时有效的iOS抽屉用户界面

时间:2018-12-11 02:45:43

标签: ios swift xcode uiviewcontroller

以下应用程序Drawer Demo无法正常工作,直到我添加了自述文件中显示的断点。没有断点,UI将无法完成填充,并且无法识别平移手势。有了断点,一切都按设计工作。

该应用程序具有2个视图控制器:父级vc和通过以下方式添加到父级中的抽屉vc:

override func viewDidLoad() {
    super.viewDidLoad()
    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BottomSheetViewController") as! DrawerViewController
    vc.configureDrawer(containerView: drawerContainer, overlaidView: overlaidView)
    drawerContainer.addSubview(vc.view)
}

解决方案 与断点无关,那只是a幸。 @rob mayof指出的问题是未连接子视图控制器和父视图控制器。正确的解决方案在下面标记。为了供其他可能遇到此问题的人参考,Apple在https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html中描述了实现这些问题的正确方法。

脚注 开发此示例是为了尝试在更大的项目中重现和隔离问题。在尝试这样做时,发现了这种意外行为并找到了解决方案。

1 个答案:

答案 0 :(得分:4)

这是您的代码:

override func viewDidLoad() {
    super.viewDidLoad()
    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BottomSheetViewController") as! DrawerViewController
    vc.configureDrawer(containerView: drawerContainer, overlaidView: overlaidView)
    drawerContainer.addSubview(vc.view)
}

(下次请在您的问题中添加它。)

您必须通过建立父/子视图控制器关系来告诉UIKit一个视图控制器的视图在另一个视图控制器的视图的层次结构中。因此,您需要添加以下行:

override func viewDidLoad() {
    super.viewDidLoad()
    let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BottomSheetViewController") as! DrawerViewController
    addChildViewController(vc)  // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    vc.configureDrawer(containerView: drawerContainer, overlaidView: overlaidView)
    drawerContainer.addSubview(vc.view)
    vc.didMove(toParentViewController: self) // <<<<<<<<<<<<<<<<<<<<<<<
}