Странное поведение Степпера в SwiftUI - PullRequest
1 голос
/ 20 ноября 2019

Я хочу использовать представление Stepper в ручном (без привязки) режиме, используя onIncrement и onDecrement. Там странное поведение, когда я пытаюсь реализовать нижнюю и верхнюю границы, например. значение возраста не должно быть меньше 1 или выше 10.

Если вы попробуете следующий код, вы можете нажать «-» два раза после того, как оно уже будет иметь значение «1». Это не идет ниже 1, как ожидалось, но после двух дополнительных нажатий кнопка «-» внезапно отключается. Если затем нажать «+», ничего не происходит. Только после 2 дополнительных нажатий на «+» счетчик реагирует, как и ожидалось, и переходит к 2.

Это ошибка?

struct StepperTest: View {
    @State private var age = 5

    var body: some View {
        VStack {
            Stepper("Enter your age", onIncrement: {
                if self.age < 10 {
                    self.age += 1
                    print("Adding to age")
                }
            }, onDecrement: {
                guard self.age > 1 else { return }
                self.age -= 1
                print("Subtracting from age")
            })

            Text("Your age is \(age)")
        }
    }
}

1 Ответ

0 голосов
/ 20 ноября 2019

Я думаю, что здесь есть объяснение:

/// onIncrement будет инициализировано в nil, если попытка увеличить
/// value не будет иметь никакого эффекта. Аналогично, onDecrement будет инициализирован
/// на nil, если попытка уменьшить value не даст эффекта.

Если вы попытаетесь

Stepper("Enter your age", onIncrement: {
    print("Adding to age")
}, onDecrement: {
    print("Subtracting from age")
})

... вы увидите, что степперы попали в то же состояние, как вы описали, поэтому Apple отслеживает перестроение представления Stepper, если перестройка не была инициирована действием пользователя на Stepper (то есть без эффекта), она отключается сама.

Другой вопрос, почему это не сразу ...

...