С наблюдением по значению ключа это довольно просто. Требуется IBOutlet
степпера
@IBOutlet var stepper: UIStepper!
Объявление NSKeyValueObservation
свойства
var observation : NSKeyValueObservation?
В viewDidLoad
соблюдайте value
степпера и настройте его, если значение new равно 0. Преимущество KVO заключается в том, что вы получаете значения old
и new
для обнаружения направление шага
override func viewDidLoad() {
super.viewDidLoad()
observation = stepper.observe(\.value, options: [.old, .new], changeHandler: { (stepper, change) in
if change.newValue! == 0.0 {
if change.newValue! > change.oldValue! {
stepper.value = 1
} else {
stepper.value = -1
}
}
})
}
Если шагер находится в ячейке табличного представления, объявите выход и свойство observation
в ячейке и назначьте наблюдателя в cellForRow
контроллера
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyGreatCell
let model = datasource[indexPath.row] // just an example
cell.stepper.value = model.stepperValue
...
cell.observation = cell.observe(\.stepper.value, options: [.old, .new], changeHandler: { (stepper, change) in
if change.newValue! == 0.0 {
if change.newValue! > change.oldValue! {
stepper.value = 1
} else {
stepper.value = -1
}
}
model.stepperValue = stepper.value
}
return cell
}
И вам нужно реализовать didEndDisplaying
, чтобы освободить наблюдателя
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let tableCell = cell as! MyGreatCell
tableCell.observation = nil
}