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

Другие вопросы по тегам