Как скрыть клавиатуру при использовании SwiftUI? - PullRequest
6 голосов
/ 07 июня 2019

Как скрыть keyboard, используя SwiftUI для нижеследующих случаев?

Дело 1

У меня есть TextField, и мне нужно скрыть keyboard когда пользователь нажимает кнопку return.

Дело 2

У меня есть TextField, и мне нужно скрыть keyboard, когда пользователь нажимает снаружи.

Как я могу сделать это, используя SwiftUI?

Примечание:

Я не задавал вопрос относительно UITextField.Я хочу сделать это с помощью SwifUI (TextField).

Ответы [ 2 ]

9 голосов
/ 07 июня 2019

Единственное, что я нашел до сих пор, чтобы закрыть клавиатуру, это позвонить endEditing(_:) на keyWindow:

struct ContentView : View {
    @State private var name: String = ""

    var body: some View {
        VStack {
            Text("Hello \(name)")
            TextField($name, placeholder: Text("Name...")) {
                // Called when the user tap the return button
                // see `onCommit` on TextField initializer.
                UIApplication.shared.keyWindow?.endEditing(true)
            }
        }
    }
}

Если вы хотите закрыть клавиатуру касанием, вы можете создать полноэкранный белый вид с действием касания, которое вызовет endEditing(_:):

struct Background<Content: View>: View {
    private var content: Content

    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content()
    }

    var body: some View {
        Color.white
        .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
        .overlay(content)
    }
}

struct ContentView : View {
    @State private var name: String = ""

    var body: some View {
        Background {
            VStack {
                Text("Hello \(self.name)")
                TextField(self.$name, placeholder: Text("Name...")) {
                    self.endEditing(true)
                }
            }
        }.tapAction {
            self.endEditing(true)
        }
    }

    private func endEditing(_ force: Bool) {
        UIApplication.shared.keyWindow?.endEditing(force)
    }
}
3 голосов
/ 12 июня 2019

Похоже, что решение endEditing - единственное, на которое указал @rraphael.
Самый чистый пример, который я видел до сих пор, таков:

extension View {
    func endEditing(_ force: Bool) {
        UIApplication.shared.keyWindow?.endEditing(force)
    }
}

и затем использовать его в onCommit:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...