更多内容欢迎关注公众号:Swift花园
UIViewController init
实际上,UIViewController 的构造过程相当直接。想要完全掌控,你只需要重写几个方法。根据环境的区别,不同的 init 方法会被调用。如果你用的是 storyboard,init(coder) 将是你的选择。如果你是通过外部 nib 文件构建控制器, init(nib, bundle) 将被调用。第三种选择是,通过代码初始化控制器。
让我介绍两种 UIViewControllers 的模式,第一种很常见,就是 init 函数,包括每一种可以构建控制器的情况。
import UIKit
class ViewController: UIViewController {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
init() {
super.init(nibName: nil, bundle: nil)
self.initialize()
}
func initialize() {
// 你的初始化代码
}
}你还可以在子类中隐藏 init(nib, bundle) 和 init(coder) 方法。
import UIKit
class ViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
self.initialize()
}
required convenience init?(coder aDecoder: NSCoder) {
self.init(coder: aDecoder)
self.initialize()
}
func initialize() {
// 你的初始化代码
}
}
class MyFutureViewController: ViewController {
override init() {
super.init()
}
}
let vc = MyFutureViewController()UIView init
通常,我会为 UIView 创建一个通用构造器让构造过程更舒服。
import UIKit
class View: UIView {
init() {
super.init(frame: .zero)
self.initialize()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.initialize()
}
func initialize() {
self.translatesAutoresizingMaskIntoConstraints = false
}
}如果你是从一个 nib 文件中初始化 View,便利构造器会十分有用。
import UIKit
extension UIView {
public convenience init(autolayout: Bool) {
self.init(frame: .zero)
self.translatesAutoresizingMaskIntoConstraints = !autolayout
}
public static func create(autolayout: Bool = true) -> Self {
let _self = self.init()
let view = _self as UIView
view.translatesAutoresizingMaskIntoConstraints = !autolayout
return _self
}
public static func createFromNib(owner: Any? = nil, options: [AnyHashable: Any]? = nil) -> UIView {
return Bundle.main.loadNibNamed(String(describing: self), owner: owner, options: options)?.last as! UIView
}
}
let view = UIView(autolayout: true)利用这类代码,维护 UIKit 类的初始化过程将变得非常简单,因为几乎所有类都是派生这两种“主要的”类。
我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~