Чтобы обработать числовую проверку текстового поля, я пытаюсь написать наблюдаемый объект, чтобы проверить, является ли ввод числом. Однако я обнаружил, что значение было сброшено, и я не могу показать исходное значение поля.
Вот мой код.
struct editor: View {
@ObservedObject var food: Food
@ObservedObject var count = NumericInputValidator()
var body: some View {
Form {
TextField("\(self.food.count)", text: $count.value) // $count.value always = 0
.multilineTextAlignment(.trailing)
.keyboardType(.decimalPad)
}
}
.onAppear(perform: {
self.count.value = String(food.count)
print(self.count.value) // correct
print(food.count) // correct
}
)
}
}
Вы можете предположить, что моя структура питания содержит количество переменных в CoreData.
@NSManaged public var count: Int16
Валидатор, как показано ниже:
class NumericInputValidator: ObservableObject {
@Published var value = "" {
didSet {
let filteredValue = value.filter { $0.isNumber }
if value != filteredValue {
value = filteredValue
}
}
}
}
При появлении я предполагаю, что значение count уже присвоено count.value, поэтому оно должно отображаться как $ count.value в текстовом поле. Однако результаты показывают, что это всегда 0. Почему это так?
возможный дубликат stackoverflow.com/q/66921708/2303865
Вы проверили ответ, указанный в вашем вопросе выше? Он показывает, как добавить привязку для обновления вашего значения.
Кстати, свойство isNumber iCharacter вернет true и для дробных значений, таких как ⅚. Что вам нужно, так это value.filter { ("0"..."9").contains($0) }





Не по теме, но ваш валидатор должен быть улучшен, если пользователь добавляет двойное значение, скажем, 4.5, вывод будет 45.