如何通过storyboard或xib实现BaseViewController?

时间:2018-02-02 13:49:04

标签: ios uiviewcontroller storyboard xib abstraction

等等,我知道这个问题标题看起来非常重复,但实际上并非如此 我一直在寻找一整天,但找不到任何好的解决方案。

术语定义

BaseViewController:扩展UIViewController的类,负责跨不同的子视图控制器的一些常见行为。
VC:ViewController的简写形式,我将从现在开始使用它 dialog:换句话说,弹出窗口;一个VC不覆盖整个屏幕,并以模态方式存在。

方案

让我用一个例子来说明我的需求。

假设我有一个应用程序,可以在不同的地方显示对话框 这些对话框有一些共同点,包括:

  1. 显示时会模糊背景
  2. 它们具有相同的宽度
  3. 它们具有相同的对话框容器样式(例如圆角半径)
  4. 他们也有非常见的东西 - 对话框容器中的内容。

    为了减少代码重复,我想先创建一个BaseDialogVC来实现上面3个常见的东西,然后子类BaseDialogVC的子类将提供容器内的视图。

    因此,我创建了一个包含BaseDialogVC的故事板文件,并使用Storyboard的Interface Builder实现了3个常见内容。
    它有一个空的UIView,作为其子类的容器来提供它们的内容 然后,我创建了BaseDialogVC的子类,例如AddItemDialogVC。然后,此AddItemDialogVC负责提供其内容视图以及此对话框的逻辑。

    然后我被困 - 我试图从故事板中AddItemDialogVC实例化,但它会崩溃,因为故事板没有AddItemDialogVC。它只有BaseDialogVC

    问题

    实际上,我知道一种可以实现类似事情的替代方案 那就是 - 我不是子类 BaseDialogVC,而是实例化它,并通过调用它的实例方法向其添加子视图,传入UIView

    但我仍然非常想知道我的原始方法有什么问题,或者, 解决这个问题的最佳方法是什么?

    通过“最好的方法”,我的意思是它有效地减少了重复并且易于维护。

    我尝试了什么

    我发现this post要将BaseDialogVC更改为AddItemDialogVC。但即使它成功创建了AddItemDialogVCAppItemDialogVC也无法初始化其内容视图(自定义视图是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]
        }
    
    }
    

0 个答案:

没有答案