У вас есть пара опций, когда вы хотите, чтобы один объект (например, контроллер представления) «что-то делал», когда значение / свойство в другом объекте изменяется:
- шаблон протокола / делегата
- Центр уведомлений
- KVO (наблюдение значения ключа)
У каждого есть свои плюсы и минусы.Центр уведомлений можно использовать , но он не очень подходит для этой задачи.
Шаблон протокола / делегата используется очень часто, и это то, что каждый должен изучить.
KVOЭто, пожалуй, лучший вариант для этого конкретного случая, а также (возможно) самый простой в реализации.
Итак, для KVO вы будете сообщать, что вы просматриваете контроллер на O , сохраняйте любые измененияк V методу K ey rating
, который является собственностью вашего клиента RatingControl
.
Следуя инструкции, сначала измените ваш rating
определение в RatingControl.swift
to:
@objc dynamic var rating = 0 {
didSet {
updateButtonSelectionStates()
}
}
мы просто добавили @objc dynamic
спецификаторы.
Затем, в ViewController.swift
, добавьте новый var / property и функцию (вы можетепоместите это выше viewDidLoad()
):
var ratingObserver: NSKeyValueObservation!
func ratingChanged(to rating: Int) {
print("Rating was changed to: \(rating)")
// do whatever else you want here
}
Теперь внутри viewDidLoad()
мы реализуем сервер O :
ratingObserver = ratingControl.observe(\.rating, options: [.new]) {
[weak self]
(ratingControl, change) in
self?.ratingChanged(to: change.newValue ?? 0)
}
Мы имеемТеперь говорят: всякий раз, когда значение .rating
в объекте ratingControl
изменяется, отправьте это новое значение в наш ratingChanged()
func.Оттуда вы можете делать с ней все, что захотите - хранить, использовать для изменения чего-либо, отправлять на сервер и т. Д.