【问题标题】:Custom UIView for an UIViewController in SwiftSwift 中 UIViewController 的自定义 UIView
【发布时间】:2016-04-12 18:40:10
【问题描述】:

我使用代码为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
}

我为我所有的视图控制器都这样做,我正在寻找更优雅的方式,因为这个过程是重复的,所以有没有任何解决方案可以使这个通用化,例如,创建一个超级抽象类,或者为 UIViewController 创建一个扩展和 UIView,协议?我是 Swift 的新手,我认为 Swift 可以通过它的现代模式提供更好的优雅解决方案

【问题讨论】:

  • 您在这里要解决的主要问题是什么?重复代码?如果是这种情况,为什么不让 ViewController 和 View 类成为您可以扩展的抽象类?
  • 为此自定义视图尝试自定义委托协议
  • 不知何故我觉得你应该更多地使用storyboards/xibs。我必须创建自定义视图是非常罕见的。当您可以在可视化编辑器中更快、更有效地做这些事情时,为什么还要在代码中使用子视图和布局设置呢?

标签: ios swift design-patterns uiviewcontroller swift-protocols


【解决方案1】:

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

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

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多