[英]Custom UIView for an UIViewController in Swift
我使用代码为UIViewController
创建视图(带子视图),这就是我这样做的方法:
覆盖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.