当点击segmentedControl时,SwiftUI关闭键盘

时间:2019-10-12 00:54:49

标签: ios swiftui resignfirstresponder

我在SwiftUI中有一个TextField,需要根据SegementedControl()选择器确定的@State变量的值使用其他键盘。

当用户点击另一个段时,如何关闭键盘(例如发送endEditing事件)?我需要这样做,因为我想更改键盘类型,并且如果textField是响应者,则键盘不会更改。

我有这个扩展名:

extension UIApplication {
    func endEditing() {
        sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}

我可以做类似的事情

UIApplication.shared.endEditing()

但是当用户点击其他细分时,我不知道在哪里或如何称呼它。

我尝试将tapGesture放置在Picker上,并且键盘确实关闭,但是Tap不会传递到Picker,因此它不会改变。

此处的代码段:

@State private var type:String = "name"

。 。

Form {
    Section(header: Text("Search Type")) {
        Picker("", selection: $type) {
            Text("By Name").tag("name")
            Text("By AppId").tag("id")
        }.pickerStyle(SegmentedPickerStyle())
    }

    Section(header: Text("Enter search value")) {
        TextField(self.searchPlaceHolder, text: $searchValue)
            .keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
    }
}

3 个答案:

答案 0 :(得分:2)

自iOS 13 / iPadOS 13发布以来的更新。

由于一个应用程序现在支持多个窗口,因此您需要遍历UIWindows并逐一结束编辑。

UIApplication.shared.windows.forEach { $0.endEditing(false) }

答案 1 :(得分:2)

SwiftUI 2.0

现在可以使用.onChange以更优雅的方式完成操作(实际上它可以附加到任何视图,但是在TextField看来是有意的)

TextField("Placeholder", text: $searchValue)
    .keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
    .onChange(of: type) { _ in
        UIApplication.shared.endEditing()   // << here !!
    }

SwiftUI 1.0 +

与上述方法非常相似

a)需要import Combine ...

TextField("Placeholder", text: $searchValue)
    .keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
    .onChange(of: type) { _ in
        UIApplication.shared.endEditing()
    }
    .onReceive(Just(type)) { _ in
        UIApplication.shared.endEditing()   // << here !!
    }

b)...而不是

TextField("Placeholder", text: $searchValue)
    .keyboardType(self.type == "name" ? UIKeyboardType.alphabet : UIKeyboardType.numberPad)
    .onReceive([type].publisher) { _ in
        UIApplication.shared.endEditing()   // << here !!
    }

答案 2 :(得分:1)

将自定义Binding附加到Picker并在设置时调用endEditing()的{​​{1}}:

Section(header: Text("Search Type")) {
    Picker("", selection: Binding(get: {
        self.type
    }, set: { (res) in
        self.type = res
        UIApplication.shared.endEditing()
    })) {
        Text("By Name").tag("name")
        Text("By AppId").tag("id")
    }.pickerStyle(SegmentedPickerStyle())
}