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