swiftUI 如何在键盘上设置搜索按钮

swiftUI how to have search button on keyboard

SwiftUI 中,我有一个简单的搜索 TextField,用户可以在其中键入要搜索的内容和一个按钮搜索。

我只想在 Keyboard 的右下角添加按钮搜索按钮(我在某些应用程序中看到过)

我该怎么做?

如果我理解正确的话你想改变UIReturnKeyType。 在这种情况下,您必须使用 UIKit,因为在 SwiftUI 中还没有任何选项可以更改 return 键的类型。 为此,您必须使用 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)
    }
}

简单使用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...
   }

iOS 15

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

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