了解UIKit中两个常用类的初始化过程。了解UIViewcontroller和UIView初始化模式。
UIKit
是在iOS开发过程中必须也是使用频次最高的一个类库,里面包含了许多与用户直接交互的控件比如:UIView
, UITableView
, UIScrollView
等。在收到用户交互的设计图之后,我们要合理的使用这些控件,就能编写出交互良好的应用。
除了类库中包含的基础控件之外,我们也能够对控件根据业务需要进行整合,也就是设计出一套适用于本公司的组件,提高开发速度。
UIViewController 初始化
实际上,UIViewController
的初始化非常简单。如果要完全控制,则只需要重写一些方法。这取决于你使用何种方式调用 init
,如果你使用一个 storyboard
初始化控制器,那么 init(coder) 是你所需要的。如果你尝试从外部 nib
文件启动控制器,则将调用 init(nib,bundle)
。你还有第三个选择,你可以通过代码以编程方式初始化控制器。简而言之,为了进行合理的初始化过程,这是你必须要做的。
下面介绍两种 UIViewControllers
的初始化模式,第一种只是一个常见的init函数,在每种情况下都可以调用该函数来初始化控制器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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)
方法。在子类中不必重写 init(nib,bundle)
,并且可以将 init(coder)
标记为默认初始化程序。这个似乎是有点棘手的解决方案,使用起来不是很方便,但确实可以完成 ViewController
的初始化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 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 初始化
我们通常为 UIView
创建一个通用的初始化程序,以使初始化过程更加轻松,使用起来更加方便。还会在该初始值设定项方法中将 translate autoresizing mask
属性设置为 false
,因为它是2017年,没有人再使用 spring&struts
了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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文件中初始化视图,那么有一些便利的方法也很好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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
类维护一个合理的初始化过程确实很容易,因为其中大多数都是从这两个 “主要” 类派生的。