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

Posted

技术标签:

【中文标题】仅在插入断点时才有效的 iOS 抽屉 UI【英文标题】:iOS Drawer UI that only works when breakpoint inserted 【发布时间】:2018-12-11 02:45:42 【问题描述】:

在我添加自述文件中显示的断点之前,以下应用程序 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 中描述了实现这些问题的正确方法。

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

【问题讨论】:

【参考方案1】:

这是你的代码:

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

【讨论】:

不知道。 Rob,我已根据您的建议编辑了问题,并添加了对 Apple 关于容器视图控制器的文档的引用。你今天教会了我一些东西。谢谢。

以上是关于仅在插入断点时才有效的 iOS 抽屉 UI的主要内容,如果未能解决你的问题,请参考以下文章

iOS:推送通知仅在应用程序在前台运行时才有效

Facebook SDK 3.2 登录仅在应用程序未终止时才有效

Cordova,onResume() 仅在我包含 alert() 时才有效

为啥 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?

异步/等待仅在读取文件时才是有效的异步函数[重复]

Firebase 云消息传递的 getToken() 仅在我省略 usePublicVapidKey 方法时才有效,为啥?