【发布时间】:2020-05-04 21:22:49
【问题描述】:
在SwiftUI 我有一个简单的搜索TextField 用户输入要搜索的内容和一个按钮搜索。
我只是想在Keyboard的右下角添加一个选项来让按钮搜索(我在某些应用程序中看到过)
我该怎么做?
【问题讨论】:
-
也许你可以使用 .keyboardType(.webSearch)
标签: swift button keyboard swiftui textfield
在SwiftUI 我有一个简单的搜索TextField 用户输入要搜索的内容和一个按钮搜索。
我只是想在Keyboard的右下角添加一个选项来让按钮搜索(我在某些应用程序中看到过)
我该怎么做?
【问题讨论】:
标签: swift button keyboard swiftui textfield
如果我理解正确,您想更改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)
}
}
【讨论】:
简单使用 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...
}
【讨论】: