以下应用程序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中描述了实现这些问题的正确方法。
脚注 开发此示例是为了尝试在更大的项目中重现和隔离问题。在尝试这样做时,发现了这种意外行为并找到了解决方案。
答案 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) // <<<<<<<<<<<<<<<<<<<<<<<
}