Это довольно просто с наблюдением за ключом и значением. Требуется IBOutlet
шагового двигателя
@IBOutlet var stepper: UIStepper!
Объявите свойство NSKeyValueObservation
var observation : NSKeyValueObservation?
В viewDidLoad
наблюдайте за value
шагового двигателя и настройте его, если новое значение равно 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
}
person
vadian
schedule
03.07.2019