【问题标题】:SwiftUI dismiss keyboard when tapping segmentedControl点击segmentedControl时SwiftUI关闭键盘
【发布时间】:2020-02-09 11:52:58
【问题描述】:

我在 SwiftUI 中有一个 TextField,它需要使用不同的键盘,具体取决于由 SegementedControl() 选择器确定的 @State 变量的值。

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

我有这个扩展:

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

我可以做类似的事情

UIApplication.shared.endEditing()

但是当用户点击不同的段时,我不知道在哪里或如何调用它。

我尝试在选择器上放置一个 tapGesture 并且键盘确实关闭了,但点击没有传递到选择器,因此它不会改变。

代码 sn-p 在这里:

@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)
    }
}

【问题讨论】:

    标签: ios swiftui resignfirstresponder


    【解决方案1】:

    将自定义Binding 附加到Picker,在设置时调用endEditing()

    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())
    }
    

    【讨论】:

    • 完美。谢谢
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      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 !!
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 1970-01-01
        • 2020-05-17
        • 2021-05-04
        • 2020-02-20
        • 1970-01-01
        相关资源
        最近更新 更多