Предотвратить UIStepper от 0? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть UIStepper, у которого stepValue составляет 1.Я бы хотел, чтобы UIStepper мог быть положительным или отрицательным вплоть до значений maximum и minimum, но никогда 0.

Каждая попытка решить эту проблему не может объяснить, уменьшался или увеличивался шаговый шаг (таким образом, следует пропускать 0 до 1 или -1).Единственное, о чем я могу думать, - это сохранить предыдущее значение и сравнить его, но для такой простой задачи это кажется немного сложным.

Есть идеи?Кто-нибудь еще сталкивался с такими же требованиями?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Я бы подошел к этому с другой стороны.Позвольте степперу делать то, что он делает, и просто измените его интерпретацию.

Например, если у вас есть степпер, который вы хотите перейти от -5 до +5, но пропустив 0:

  1. Установите шагер minumum на -5.
  2. Установите шагер maximum на 4.
  3. Установите шагер stepValue на 1.
  4. Когда вы читаете степпер value, добавьте 1, если value неотрицательно:

    let value = stepper.value + (stepper.value < 0 ? 0 : 1)
    
  5. Когда вы установитешаговый value, сначала уменьшите положительные значения на 1:

    // value of 3 will be represented in the stepper by 2
    value = 3
    stepper.value = value - (value > 0 ? 1 : 0)
    

Скрыть детали с помощью вычисляемого свойства nonZeroValue

Вы можете скрыть эти настройки +1 и -1, создав расширение UIStepper, которое добавляет новое вычисляемое свойство с именем nonZeroValue.

extension UIStepper {
    var nonZeroValue: Double {
        get {
            return self.value + (self.value < 0 ? 0 : 1)
        }
        set {
            self.value = newValue - (newValue < 0 ? 0 : 1)
        }
    }
}

Затем просто используйте stepper.nonZeroValue вместо stepper.value в вашем коде.

1 голос
/ 03 июля 2019

С наблюдением по значению ключа это довольно просто. Требуется 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...