我想将选择器设置为 TextField 的输入 View ,我可以只使用 SwiftUI 来实现,还是必须在框架集成的帮助下使用 UIKit 组件?
UIKit 中的代码示例:
textField.inputView = UIPickerView()
我想做同样的事情,但是使用 SwiftUI 的 TextField
最佳答案
我在使用上述解决方案时发现的唯一问题是,每当键盘进入编辑阶段时,都会显示选择器,同时还会显示键盘。
因此无法隐藏键盘并显示选择器。 因此,我编写了一个自定义结构来处理这种行为,类似于我们使用 UITextField inputView 所做的事情。 你可以使用它。这适用于我的用例。
您还可以自定义选择器,以及 makeUIView 方法中的文本字段,就像我对选择器的背景颜色所做的那样。
struct TextFieldWithPickerAsInputView : UIViewRepresentable {
var data : [String]
var placeholder : String
@Binding var selectionIndex : Int
@Binding var text : String?
private let textField = UITextField()
private let picker = UIPickerView()
func makeCoordinator() -> TextFieldWithPickerAsInputView.Coordinator {
Coordinator(textfield: self)
}
func makeUIView(context: UIViewRepresentableContext<TextFieldWithPickerAsInputView>) -> UITextField {
picker.delegate = context.coordinator
picker.dataSource = context.coordinator
picker.backgroundColor = .yellow
picker.tintColor = .black
textField.placeholder = placeholder
textField.inputView = picker
textField.delegate = context.coordinator
return textField
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<TextFieldWithPickerAsInputView>) {
uiView.text = text
}
class Coordinator: NSObject, UIPickerViewDataSource, UIPickerViewDelegate , UITextFieldDelegate {
private let parent : TextFieldWithPickerAsInputView
init(textfield : TextFieldWithPickerAsInputView) {
self.parent = textfield
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.parent.data.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return self.parent.data[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.parent.$selectionIndex.wrappedValue = row
self.parent.text = self.parent.data[self.parent.selectionIndex]
self.parent.textField.endEditing(true)
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.parent.textField.resignFirstResponder()
}
}
}
您可以将其用作:-
struct ContentView : View {
@State var gender : String? = nil
@State var arrGenders = ["Male","Female","Unknown"]
@State var selectionIndex = 0
var body : some View {
VStack {
TextFieldWithPickerAsInputView(data: self.arrGenders, placeholder: "select your gender", selectionIndex: self.$selectionIndex, text: self.$gender)
}
}
}
关于swift - 有没有办法在 SwiftUI 中为 TextField 设置 inputView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57975634/