在Swift中为UIViewController定制UIView

iOS*_*eek 5 design-patterns uiviewcontroller ios swift swift-protocols

我使用代码来创建视图(带子视图),UIViewController这就是我的工作方式:

  1. 覆盖 loadView()

    class MYViewController: UIViewController {
    
    var myView: MyView! { return self.view as MyView }
    
       override func loadView() {
          view = MyView() 
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

以下是我创建自定义视图的方法:

class MyView: UIView {

    // MARK: Initialization

    override init (frame : CGRect) {
        super.init(frame : frame)
        addSubviews()
        setupLayout()
    }

    convenience init () {
        self.init(frame:CGRect.zero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("This class does not support NSCoding")
    }

    // MARK: Build View hierarchy

    func addSubviews(){
        // add subviews
    }

    func setupLayout(){
        // Autolayout
    }

    // lazy load views
}
Run Code Online (Sandbox Code Playgroud)

我为所有的View控制器执行此操作,我正在寻找更优雅的方法,因为这个过程是重复的,所以有没有任何解决方案,例如,创建一个超级抽象类,或为UIViewController和UIView创建扩展,协议?我是swift的新手,我认为Swift可以通过它的现代模式获得更好的解决方案

Geo*_*een 10

如果您想要使用自定义视图类创建许多不同的控制器,我建议的解决方案将是这些方面:

首先以您希望能够使用它的方式实现自定义视图子类,这里我使用了您在问题中使用的那个.然后,您可以在需要的任何地方将其子类化,并覆盖相关方法.

class CustomView: UIView {

    // MARK: Initialization

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubviews()
        setupLayout()
    }

    required init() {
        super.init(frame: .zero)
        addSubviews()
        setupLayout()
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("This class does not support NSCoding")
    }

    // MARK: Build View hierarchy

    func addSubviews(){
        // add subviews
    }

    func setupLayout(){
        // Autolayout
    }

}
Run Code Online (Sandbox Code Playgroud)

然后创建一个通用的自定义视图控制器,允许将类指定为通用参数,以便您可以轻松地创建具有自定义视图类的控制器.

class CustomViewController<T: CustomView>: UIViewController {

    var customView: T! { return view as! T }

    override func loadView() {
        view = T()
    }

    init() {
        super.init(nibName: nil, bundle: nil)
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,如果要定义新的自定义视图并创建使用它的控制器,您可以简单地:

class AnotherCustomView: CustomView { /* Override methods */ }

...

let controller = CustomViewController<AnotherCustomView>()
Run Code Online (Sandbox Code Playgroud)

繁荣!

如果你想要你甚至可以输入这个新的控制器类型来使它更加优雅:

class AnotherCustomView: CustomView { /* Override methods */ }

...

typealias AnotherCustomViewController = CustomViewController<AnotherCustomView>
let controller = AnotherCustomViewController()
Run Code Online (Sandbox Code Playgroud)