【问题标题】:swiftUI how to have search button on keyboardswiftUI如何在键盘上有搜索按钮
【发布时间】:2020-05-04 21:22:49
【问题描述】:

SwiftUI 我有一个简单的搜索TextField 用户输入要搜索的内容和一个按钮搜索。

我只是想在Keyboard的右下角添加一个选项来让按钮搜索(我在某些应用程序中看到过)

我该怎么做?

【问题讨论】:

标签: swift button keyboard swiftui textfield


【解决方案1】:

iOS 15

您可以使用一个名为.submitLabel 的简单修饰符更改每个textField 的返回键,该修饰符采用返回键类型,您应该传递.search。看看下面的例子:

此外,如您所见,您可以使用回调来处理返回键按下操作,就像旧的 textFieldShouldReturn 函数可通过“.onSubmit”修饰符访问一样。

【讨论】:

    【解决方案2】:

    如果我理解正确,您想更改UIReturnKeyType。 在这种情况下,您必须使用 UIKit,因为目前还没有任何选项可以更改 SwiftUI 中的返回键类型。 为此,您必须使用 UIIKit 制作一个自定义 TextField,然后按照您喜欢的方式对其进行修改。

    还请记住,UIReturnKeyType 枚举正在讨论中,可能会替换为不同的实现。

    // MARK: Custom TextField
    struct TextFieldTyped: UIViewRepresentable {
        let keyboardType: UIKeyboardType
        let returnVal: UIReturnKeyType
        let tag: Int
        @Binding var text: String
        @Binding var isfocusAble: [Bool]
    
        func makeUIView(context: Context) -> UITextField {
            let textField = UITextField(frame: .zero)
            textField.keyboardType = self.keyboardType
            textField.returnKeyType = self.returnVal
            textField.tag = self.tag
            textField.delegate = context.coordinator
            textField.autocorrectionType = .no
    
            return textField
        }
    
        func updateUIView(_ uiView: UITextField, context: Context) {
            if isfocusAble[tag] {
                uiView.becomeFirstResponder()
            } else {
                uiView.resignFirstResponder()
            }
        }
    
        func makeCoordinator() -> Coordinator {
            Coordinator(self)
        }
    
        class Coordinator: NSObject, UITextFieldDelegate {
            var parent: TextFieldTyped
    
            init(_ textField: TextFieldTyped) {
                self.parent = textField
            }
    
            func updatefocus(textfield: UITextField) {
                textfield.becomeFirstResponder()
            }
    
            func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    
                if parent.tag == 0 {
                    parent.isfocusAble = [false, true]
                    parent.text = textField.text ?? ""
                } else if parent.tag == 1 {
                    parent.isfocusAble = [false, false]
                    parent.text = textField.text ?? ""
             }
            return true
            }
    
        }
    }
    

    你可以像这样使用它: (根据您的情况将returnVal 更改为.search。)

    struct CustomeKT: View {
    
        @State var myTextForTX = ""
        @State var focused: [Bool] = [false, true]
    
        var body: some View {
            TextFieldTyped(keyboardType: .default, returnVal: .search, tag: 0, text: self.$myTextForTX, isfocusAble: self.$focused)
        }
    }
    

    【讨论】:

      【解决方案3】:

      简单使用 SearchTextField.swift

      import SwiftUI
      import UIKit
      
      class UIKitTextField: UITextField, UITextFieldDelegate {
          
          required init(coder aDecoder: NSCoder) {
              super.init(coder: aDecoder)!
              delegate = self
          }
          
          required override init(frame: CGRect) {
              super.init(frame: frame)
              delegate = self
              self.setContentHuggingPriority(.defaultHigh, for: .vertical)
          }
          
          var action:(() -> Void)? = nil
          
          func textFieldShouldReturn(_ textField: UITextField) -> Bool {
              self.action?()
              
              if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
                  nextField.becomeFirstResponder()
              } else {
                  textField.resignFirstResponder()
                  return true;
              }
              return false
          }
          
      }
      
      struct SearchTextField : UIViewRepresentable {
          
          @Binding var text: String
          var action:() -> Void
          
          func makeCoordinator() -> SearchTextField.Coordinator {
              return Coordinator(value: self)
          }
          
          class Coordinator: NSObject,UITextFieldDelegate {
              
              var parent:SearchTextField
              
              init(value: SearchTextField) {
                  self.parent = value
              }
              
              @objc func textFieldEditingChanged(_ sender: UIKitTextField) {
                  self.parent.text = sender.text ?? ""
              }
          }
          
          func makeUIView(context: Context) -> UIKitTextField {
              
              let textfield = UIKitTextField(frame: .zero)
              
              textfield.addTarget(context.coordinator, action: #selector(Coordinator.textFieldEditingChanged(_:)), for: .editingChanged)
              
              textfield.text = self.text
              textfield.placeholder = "search"
              textfield.borderStyle = .none
              textfield.returnKeyType = .search
              textfield.action = self.action
              
              return textfield
          }
          
          func updateUIView(_ uiView: UIKitTextField,
                            context: Context) {
              uiView.text = self.text
          }
          
      }
      

      使用:

        SearchTextField(text: self.$searchKey) {
            self.search(key: self.searchKey)
            // or...
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 2021-12-12
        • 2023-04-03
        • 2014-12-06
        • 2013-07-11
        相关资源
        最近更新 更多