TextField onCommit никогда не вызывается
Я работаю со SwiftUI уже неделю, и, как и все, я изо всех сил пытаюсь определить, является ли что-то, что не работает, ошибкой или недоразумением с моей стороны.
Я использую представление TextField, но закрытие onCommit никогда не выполняется. OnEditingChanged работает отлично. Он вызывается с true, когда текстовое поле получает фокус, и вызывается с false, когда теряет его.
Однако закрытие onCommit никогда не будет выполнено. Согласно небольшой документации, которая доступна в коде:
onCommit: действие, которое выполняется, когда пользователь выполняет действие (обычно клавиша возврата), пока
TextField
имеет фокус.
Это код:
TextField($value,
placeholder: Text(placeholder),
onEditingChanged: { edit in
print("edit = \(edit)")
},
onCommit: {
print("COMITTED!")
}).textFieldStyle(.roundedBorder).padding(.horizontal, 20)
В идеале я хотел бы переместить фокус из текстового поля, получающего клавишу RETURN, и поместить фокус в следующее поле. Это легко сделать с помощью UITextField и resignFirstResponder() и становиться FirstResponder().
Мне уже удалось использовать UIViewRepresentable
встроить старый UITextField, но суть этого поста не в этом. Я действительно надеюсь, что это будет работать в чистом коде SwiftUI.
Если я когда-нибудь смогу заставить onCommit работать, что я должен положить туда, чтобы достичь своей цели?
Обновление: Кажется, что проблема присутствует только с iOS, а не с MacOS, где она работает нормально.
Обновление 2: это видео о результате выполнения предложенного кода на моей машине. Я сделал ошибку в Apple... посмотрим.
2 ответа
Ваш код должен работать нормально, как и в бета-версии Xcode 11.0. Однако я могу подтвердить, что в настоящее время он не работает должным образом в бета-версии 2. Я заполнил отчет об ошибках в Apple по этой проблеме.
Обновление: эта проблема была исправлена с Xcode 11 beta 3.
Попробуйте это в реальном симуляторе.
Имейте в виду некоторые заметки:
- К сожалению, отладчик не работает с предварительным просмотром
- Консоль не связана с предварительным просмотром в реальном времени, поэтому
print()
результат не отображается - Вы можете немного изменить свой код и создать простую консоль журнала, чтобы увидеть результат, если вы хотите проверить его в режиме предварительного просмотра:
Нравится:
struct ContentView : View {
@State private var log: String = "Logs: "
@State var value: String = ""
var body: some View {
VStack() {
// Logger
Text(log)
.lineLimit(0)
.padding()
//
Spacer()
TextField($value,
placeholder: Text("placeholder"),
onEditingChanged: { edit in
self.log.append("\n edit = \(edit)")
},
onCommit: {
self.log.append("\n COMITTED!")
}).textFieldStyle(.roundedBorder).padding(.horizontal, 20)
Spacer()
}
}
}
- Просмотр в реальном времени содержит ошибку, из-за которой он не работает должным образом с клавиатурой, и имеет эпическую задержку (у меня было около 15 минут) для отображения экранной клавиатуры. Поэтому, если вы действительно хотите увидеть результат в режиме предварительного просмотра, вы должны быть очень терпеливы и ждать клавиатуры:
- Используйте симулятор или реальное устройство, чтобы проверить, что вы хотите. Видео: Xcode11-Beta1