iOS抽屉UI仅在插入断点时有效

iOS Drawer UI that only works when breakpoint inserted

在我添加自述文件中显示的断点之前,以下应用程序 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)
}

解决方案 与断点无关,那只是侥幸。 @rob mayof 指出的问题是子视图控制器和父视图控制器没有连接。正确的解决方案标记如下。对于可能面临此问题的其他人,Apple 在 https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html.

中描述了实施这些问题的正确方法

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

这是您的代码:

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)
}

(下次请将其包含在您的问题中。)

您必须通过建立 parent/child 视图控制器关系来告诉 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) // <<<<<<<<<<<<<<<<<<<<<<<
}