我正在创建一个自定义呈现控制器,用于在呈现视图控制器时使背景变暗。演示控制器在过渡开始时添加了几个子视图,效果很好。
但是,我想在Interface Builder中设置 chrome(演示文稿“框架”),因为这样更容易布局。因此,我创建了一个用于设计 chrome 的 XIB 文件。它包括一个半透明的背景视图和左上角的 ❌ 按钮,用于关闭呈现的视图控制器。对于这些子视图,我需要在我的演示控制器(不是子UIViewController
类)中使用插座和操作。
为了实现这一点,我在 Interface Builder 和实例化视图时的代码中将 XIB 文件的所有者设置为我的自定义演示控制器:
lazy var dimmingView = Bundle.main.loadNibNamed("PresentationChromeView",
owner: self,
options: nil)?.first
as! UIView
然后我通过CTRL+ 拖动到我的演示控制器创建了相应的出口和操作:
@IBOutlet var closeButton: UIButton!
@IBAction func closeButtonTapped(_ sender: Any) {
presentingViewController.dismiss(animated: true, completion: nil)
}
但是,在运行时应用程序崩溃,因为 UIKit 找不到出口键,并且在删除出口时,操作方法不会被触发。所以在这两种情况下都没有建立连接。
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<_SwiftValue 0x600000458810> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key closeButton.'
我能想到为什么这不起作用的唯一原因是不允许使用不继承自UIView
or的类创建出口和操作UIViewController
。
这个假设正确吗?
有没有办法用非视图(-控制器)类创建出口和动作?