Swift - 如何从许多由 UIPickerView 生成数据的 UITextFields 中读取数据

Swift - how to read data from many UITextFields which generate data by UIPickerView

我在尝试从 UITextFields 读取数据时遇到问题。

我有 3 个用于 textFields 的 IBOutlets(性别、目标和每天的用餐次数)。所有这些文本字段的数据都将由 UIPickerView 显示。我准备了 3 个数据集,所有文本字段都不同。当我点击第一个 textField(性别)时,我有带有数据(男性和女性)的 PickerView,之后当我点击 UIPickerView 上的第二个 textField(目标)数据集时没有重新加载但是,当我点击第三个 TextField(用餐次数) pickerView 数据重新加载了第二个 textField 的数据。当我从 pickerView 中选择一些东西时,第二个 textFieled 被设置(在点击第三个 textField 之后!)。它总是像一样工作。 有什么想法吗?

看看 UITextView delegate。您可以使用 textFieldDidBeginEditing(_ textField: UITextField) 来检测是否已选择文本字段(成为第一响应者)。

然后使用 textField 参数检测哪个文本字段已被选中,并根据该参数加载选择器数据。

您可以将 pickerView 设置为 textField.inputView

下面的示例是两个文本字段共享一个选择器视图,但您可以通过在选择器视图委托方法中检查 activeTextField 的身份来轻松扩展它。

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var myTextFieldOne: UITextField!
    @IBOutlet weak var myTextFieldTwo: UITextField!

    let pickerDataOne = ["A", "B", "C", "D", "E", "F"]
    let pickerDataTwo = ["1", "2", "3", "4", "5", "6"]

    // Holds a reference to current text field
    var activeTextField = UITextField()

    override func viewDidLoad() {
        super.viewDidLoad()
        let myPicker = UIPickerView()
        myPicker.delegate = self
        myPicker.dataSource = self
        myTextFieldOne.inputView = myPicker
        myTextFieldTwo.inputView = myPicker
    }

    // MARK: UITextField Delegate

    func textFieldDidBeginEditing(textField: UITextField!) {
        // Sets tapped textField to active one
        self.activeTextField = textField
        if let picker = self.activeTextField.inputView as? UIPickerView {
            // This is one way to get a reference to the picker view
            picker.reloadAllComponents()
        }
    }

    // MARK: UIPickerView Delegate

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        // You can have a different data source for each text field
        if activeTextField === myTextFieldOne {
            return pickerDataOne.count
        } else if activeTextField === myTextFieldTwo {
            return pickerDataTwo.count
        }
    }

    func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        // Gets the title for each row in picker
        if activeTextField === myTextFieldOne {
            return pickerDataOne[row]
        } else if activeTextField === myTextFieldTwo {
            return pickerDataTwo[row]
        }
    }

    func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // Populates the text field
        if activeTextField === myTextFieldOne {
           myTextFieldOne.text = pickerDataOne[row]
        } else if activeTextField === myTextFieldTwo {
           myTextFieldTwo.text = pickerDataTwo[row]
        }
    }

}

例如,您可以通过获取 myTextFieldOne.text 来访问任何文本字段中的文本。