TextField onCommit никогда не вызывается - PullRequest
3 голосов
/ 18 июня 2019

Я работаю со 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 () и intoFirstResponder ().

Мне уже удалось использовать UIViewRepresentable для встраивания старого UITextField, но суть этого поста не в этом. Я действительно надеюсь, что он будет работать в чистом коде SwiftUI.

Если я когда-нибудь смогу заставить работать onCommit, что я должен поставить туда, чтобы достичь своей цели?

Обновление : Похоже, проблема присутствует только в iOS, а не в macOS, где она работает нормально.

Обновление 2 : это видео о результате выполнения предложенного кода на моей машине. Я подал ошибку в Apple ... посмотрим.

enter image description here

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Ваш код должен работать нормально, как это происходит в бета-версии Xcode 11.0. Однако я могу подтвердить, что в настоящее время это не работает, как ожидалось в бета-версии 2. Я заполнил отчет об ошибках в Apple для этой проблемы .


Обновление : эта проблема была исправлена ​​с Xcode 11 beta 3 .

1 голос
/ 18 июня 2019

Попробуйте в реальном симуляторе.

Помните о некоторых заметках:

  • К сожалению, отладчик не работает с предварительным просмотром в реальном времени
  • Консоль не подключена кпредварительный просмотр в реальном времени, поэтому 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 минут), чтобы показатьэкранная клавиатура.Поэтому, если вы действительно хотите увидеть результат в режиме предварительного просмотра, вы должны быть очень терпеливы и дождаться клавиатуры:

enter image description here

  • Используйте симулятор или реальное устройство, чтобы проверить, что вы хотите.Видео: Xcode11-Beta1

enter image description here

...