swift - 有没有办法在 SwiftUI 中为 TextField 设置 inputView?

标签 swift swiftui

我想将选择器设置为 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/

相关文章:

class - 快速调用父类中的按钮点击方法

ios - 在 iOS 扩展和应用程序之间使用 UIApplication.shared 共享 CocoaPod

arrays - 索引超出范围 SwiftUI

swift - 在 SwiftUI 中更新 ScrollView 的正确方法是什么? (MacOS 应用程序)

ios - 获取 SwiftUI ScrollView 的当前滚动位置

ios - 拍照后如何暂停?

ios - 如何以编程方式找到 Swift 的版本?

ios - 我们可以从我们的 ios 应用程序启动我们的应用程序设置页面吗?

SwiftUI:如何删除 VStack 中 View 之间的边距?

ios - PresentationButton 没有触发 Action 两次