繁体   English   中英

在Swift中为UIViewController定制UIView

[英]Custom UIView for an UIViewController in Swift

我使用代码为UIViewController创建视图(带子视图),这就是我这样做的方法:

  1. 覆盖loadView()

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

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

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
}

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

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

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

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
    }

}

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

class CustomViewController<T: CustomView>: UIViewController {

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

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

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

}

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

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

...

let controller = CustomViewController<AnotherCustomView>()

繁荣!

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

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

...

typealias AnotherCustomViewController = CustomViewController<AnotherCustomView>
let controller = AnotherCustomViewController()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM