Похоже, Xcode 13.3 сломал TextField с форматированием. В приведенном ниже примере текст должен отображать значение, введенное в TextField, которое отлично работает при сборке с Xcode 13.2.1 (снова понижено для тестирования), но с Xcode 13.3 TextField не обновляет значение привязки.
struct ContentView: View {
@State var value: Float?
let decimalFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 3
return formatter
}()
var body: some View {
VStack {
TextField("some float", value: $value, formatter: decimalFormatter)
.multilineTextAlignment(.center)
.keyboardType(.decimalPad)
Text("Value: \(value != nil ? String(value!) : "nil")")
}
}
}
хороший улов! Поскольку это проблема с необязательным параметром, для меня это звучит как ошибка - отправил его в Apple с помощью Feedback Assistant.
Кажется, что TexField, который вы хотите использовать, не существует. «formatter» действителен только для необязательных.
Кажется, документация Apple немного неточна, поскольку developer.apple.com/documentation/swiftui/textfield/… упоминает: «Создает текстовое поле, которое применяет средство форматирования к связанному необязательному значению, с меткой, сгенерированной из построителя представлений». хотя связанное значение в подписи не является необязательным
Нашел другой API, который делает то, что я ожидал, с необязательными параметрами: https://developer.apple.com/documentation/swiftui/textfield/init(_:value:format:prompt:)-6ug7k.
TextField("some float", value: $value, format: FloatingPointFormatStyle.number)
Хотя это не объясняет, почему ранее он работал с Formatter и перестал работать с Xcode 13.3, по крайней мере, этот API кажется специфичным для необязательных значений.
Ограничение дробных цифр до 3 также работает, просто оно применяется не сразу во время редактирования, а впоследствии при изменении фокуса.
TextField("some float", value: $value, format: FloatingPointFormatStyle.number
.precision(NumberFormatStyleConfiguration.Precision.fractionLength(0...3)))
если
value
не является обязательным, это работает ... (просто наблюдение, а не решение)