【发布时间】:2018-05-23 02:06:04
【问题描述】:
使用 MVC 方法进行 iOS 应用程序开发,我想通过发布到 NotificationCenter 来观察模型的变化。对于我的示例,Person.swift 模型是:
class Person {
static let nameDidChange = Notification.Name("nameDidChange")
var name: String {
didSet {
NotificationCenter.default.post(name: Person.nameDidChange, object: self)
}
}
var age: Int
var gender: String
init(name: String, age: Int, gender: String) {
self.name = name
self.age = age
self.gender = gender
}
}
观察模型的视图控制器如下图所示:
class ViewController: UIViewController {
let person = Person(name: "Homer", age: 44, gender: "male")
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var ageLabel: UILabel!
@IBOutlet weak var genderLabel: UILabel!
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var ageField: UITextField!
@IBOutlet weak var genderField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
nameLabel.text = person.name
ageLabel.text = String(person.age)
genderLabel.text = person.gender
NotificationCenter.default.addObserver(self,
selector: #selector(self.updateLabels),
name: Person.nameDidChange, object: nil)
}
@IBAction func updatePerson(_ sender: Any) {
guard let name = nameField.text, let age = ageField.text, let gender = genderField.text else { return }
guard let ageNumber = Int(age) else { return }
person.name = name
person.age = ageNumber
person.gender = gender
}
@objc func updateLabels() {
nameLabel.text = person.name
ageLabel.text = String(person.age)
genderLabel.text = person.gender
}
}
示例应用的工作原理如下:
- 在文本字段中输入姓名、年龄和性别
- 按
updatePerson按钮从文本字段值更新模型 - 模型更新时,通知观察者调用
updateLabels函数更新用户界面。
此方法需要最后设置person.name,否则必须按两次updatePerson 按钮才能更新整个用户界面。而且由于我只观察一个属性,因此通知并不代表整个班级。有没有更好的方法来观察 Swift 中模型(类或结构)的变化?
注意 - 我对在这个例子中使用 RxSwift 不感兴趣。
【问题讨论】:
标签: swift model-view-controller nsnotificationcenter notificationcenter