- Как сохранить фокус TextField после пересчета тела из-за изменения состояния?
У вас их два. Два разных TextField не могут находиться в состоянии редактирования одновременно.
Подход, предложенный Аспери, является единственно возможным.
Причина, по которой ваш код взломал sh не легко объяснить, но ожидается в текущем SwiftUI.
Вы должны понимать, что Group - это не стандартный контейнер, это просто «блок», к которому вы можете применить некоторые модификаторы. При удалении группы и использовании переносящего тела во ViewBuilder
struct CustomTextFieldView: View {
@Binding var text: String
@State var editing: Bool = false
@ViewBuilder
var body: some View {
if self.editing {
TextField("", text: $text)
.background(Color.red)
.onTapGesture {
self.editing.toggle()
}
} else {
ZStack(alignment: .leading) {
TextField("", text: $text)
.background(Color.green)
.onTapGesture {
self.editing.toggle()
}
}
}
}
}
код перестанет работать до sh, но есть и другая проблема, клавиатура немедленно исчезнет. Это из-за примененного жеста касания.
Так что, хотите верьте, хотите нет, вы должны использовать ТОЛЬКО ОДИН TextField.
struct CustomTextFieldView: View {
@Binding var text: String
@State var editing = false
var textField: some View {
TextField("", text: $text, onEditingChanged: { edit in
self.editing = edit
})
}
var body: some View {
textField.background(editing ? Color.green : Color.red)
}
}
Используйте это настраиваемое текстовое поле в любом месте вашего кода, как вы хотите