等等,我知道这个问题标题看起来非常重复,但实际上并非如此 我一直在寻找一整天,但找不到任何好的解决方案。
BaseViewController
:扩展UIViewController
的类,负责跨不同的子视图控制器的一些常见行为。
VC
:ViewController的简写形式,我将从现在开始使用它
dialog
:换句话说,弹出窗口;一个VC不覆盖整个屏幕,并以模态方式存在。
让我用一个例子来说明我的需求。
假设我有一个应用程序,可以在不同的地方显示对话框 这些对话框有一些共同点,包括:
他们也有非常见的东西 - 对话框容器中的内容。
为了减少代码重复,我想先创建一个BaseDialogVC
来实现上面3个常见的东西,然后子类BaseDialogVC
的子类将提供容器内的视图。
因此,我创建了一个包含BaseDialogVC
的故事板文件,并使用Storyboard的Interface Builder实现了3个常见内容。
它有一个空的UIView
,作为其子类的容器来提供它们的内容
然后,我创建了BaseDialogVC
的子类,例如AddItemDialogVC
。然后,此AddItemDialogVC
负责提供其内容视图以及此对话框的逻辑。
然后我被困 - 我试图从故事板中AddItemDialogVC
实例化,但它会崩溃,因为故事板没有AddItemDialogVC
。它只有BaseDialogVC
。
实际上,我知道一种可以实现类似事情的替代方案
那就是 - 我不是子类 BaseDialogVC
,而是实例化它,并通过调用它的实例方法向其添加子视图,传入UIView
。
但我仍然非常想知道我的原始方法有什么问题,或者, 解决这个问题的最佳方法是什么?
通过“最好的方法”,我的意思是它有效地减少了重复并且易于维护。
我发现this post要将BaseDialogVC
更改为AddItemDialogVC
。但即使它成功创建了AddItemDialogVC
,AppItemDialogVC
也无法初始化其内容视图(自定义视图是UIView
的子类,并且我得到了“线程1:EXC_BAD_ACCESS”异常。
我认为最相似的问题是this thread
但是,接受的答案还不够详细;而第二个最多投票的答案与我之前尝试的set_object
相同。
仅供参考,我的AddItemDialogView
课程(不是VC!):
class AddChoiceDialogView: UIView {
@IBOutlet weak var rootView: AddChoiceDialogView!
override init (frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init? (coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit () {
Bundle.main.loadNibNamed("AddChoiceDialogView", owner: self, options: nil)
addSubview(rootView)
rootView.frame = self.bounds
rootView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
}