设计模式

1.MVC

所有的类分为三种:Models、Views、Controllers

img

  • 模型Models:负责保存数据,通常为结构体或者类
  • 视图Views:负责展示屏幕上的元素和空间,通常是UIView的子类
  • 控制器Controllers:模型和视图之间的协调者,通常是UIViewController的子类
  • 三者关系:控制器管理模型和视图,强引用着模型和视图。模型和控制器通过属性观察器交互,视图和控制器通过IBActions交互

1.1 MVC的使用

a)模型

1
2
3
4
5
6
public struct Address {
public var street: String
public var city: String
public var state: String
public var zipCode: String
}

b)视图

1
2
3
4
5
6
7
public final class AddressView: UIView {
@IBOutlet weak var streetTextField: UITextField!
@IBOutlet weak var cityTextField: UITextField!
@IBOutlet weak var stateTextField: UITextField!
@IBOutlet weak var zipCodeTextField: UITextField!
@IBOutlet weak var addressLabel: UILabel!
}

c)控制器

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class AddressViewController: UIViewController {

// MARK: - Properties
public var address: Address? {
didSet { // 属性观察器
updateViewFromAddress()
}
}

public var addressView: AddressView! { // 关联view
guard isViewLoaded else {
return nil
}
return view as! AddressView
}

// MARK: - View Lifecycle
public override func viewDidLoad() {
super.viewDidLoad()
}

private func updateViewFromAddress() {
if let address = address { // 可选类型解包
addressView.addressLabel.text = "street: "+address.street+"\ncity: "+address.city+"\nstate: "+address.state+"\nzipCode: "+address.zipCode
}else {
addressView.addressLabel.text = "地址为空"
}
}

// MARK: - Actions
@IBAction public func updateAddressFromView(_ sender: AnyObject) {
guard let street = addressView.streetTextField.text, street.count > 0,
let city = addressView.cityTextField.text, city.count > 0,
let state = addressView.stateTextField.text, state.count > 0,
let zipCode = addressView.zipCodeTextField.text, zipCode.count > 0
else {
return
}
address = Address(street: street, city: city,
state: state, zipCode: zipCode)
}

@IBAction func clearAddressFromView(_ sender: Any) {
address = nil
}
}

2.代理模式

你真的了解iOS代理设计模式吗?

2.2 iOS中的消息传递方式

  • 通知:由通知中心进行消息的接收和广播,一对多
  • 代理:由代理对象、委托者、协议三部分组成
  • 闭包:将回调处理代码直接写在闭包中
  • target-action:将对象传到另一个对象中,将其当作target,调用他的对象方法
  • KVO:Category-NSKeyValueObserving,通过属性监听的方式来监测该值的变化,变化时调用KVO的回调方法

2.3 代理的基本使用

代理由三部分组成:

协议:指定代理双发可以做什么,必须做什么

代理:根据协议,完成功能

委托:根据协议,指定代理应该完成的功能

QQ截图20160316111239.png

a)协议

  • 若协议仅在一个类中使用,可以写在该类中。若多个类使用同一个协议,建议写在一个单独的文件中。
  • 协议中的方法默认是required的
1
2
3
4
@objc protocol LoginProtocol: AnyObject { // 限制协议实现的类型
// 必须实现的方法。可选方法要加上@objc optional
func userLoginWithUsername(username: String, password: String)
}

b)代理:协议的实现

1
2
3
4
5
class LoginDelegate: LoginProtocol {
func userLoginWithUsername(username: String, password: String) {
NSLog("userName: \(username), password: \(password)")
}
}

c)委托

1
2
3
4
5
6
7
class Login {
weak let delegate = LoginDelegate()

func buttonDidClicked() {
delegate.userLoginWithUsername(username: "ltp", password: "123456")
}
}
0%