Swift - 如何从 UIPickerView 生成数据的许多 UITextField 中读取数据 [关闭]

Posted

技术标签:

【中文标题】Swift - 如何从 UIPickerView 生成数据的许多 UITextField 中读取数据 [关闭]【英文标题】:Swift - how to read data from many UITextFields which generate data by UIPickerView [closed] 【发布时间】:2018-04-09 19:42:12 【问题描述】:

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

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

【问题讨论】:

所以你想用 UIPickerViews 替换 UITextFields?或者在某个地方有一个选择器,可以根据选定的文本字段重新加载? 我想要一个选择器视图,当您点击测试字段时,选择器视图会出现独家数据 【参考方案1】:

您可以将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 来访问任何文本字段中的文本。

【讨论】:

它有效,谢谢!还有一件事,当我点击第一个 textField 并从 pickerView 设置我的数据,然后点击第二个 textField 时,我在 PickerView 中有相同的数据。我必须关闭 PickerView 并重新打开它才能获取下一组数据 你可以在textfieldDidBeginEditing() 中使用pickerView.reloadAllComponents() 我已经用一个例子更新了我的答案。您需要对 pickerView 的引用:这可以通过 textField.inputView 进行,也可以在视图控制器的顶部声明,然后在 viewDidLoad() 方法中进行设置。 它有帮助,但它的工作是随机的。当我点击第一个 textField 时,出现第一个 textField 的带有 dataSet 的 PickerView。当我点击第二个文本字段时,我有相同的数据集。当我点击第三个文本字段时,我有第二个文本字段的数据集(当我从pickerView中选择一些东西时设置了值),最后当我回到第二个文本字段时,我有第三个文本字段的数据集(当我设置了值从pickerView中选择一些东西)。在模拟器和真机上测试 我将不得不考虑问题可能是什么。重新加载选择器视图数据时可能需要更改。 发现问题。我为 textFiels 设置了错误的操作。现在完美运行。感谢您的帮助:)【参考方案2】:

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

然后使用textField参数来检测选择了哪个文本字段,并据此加载选择器数据。

【讨论】:

以上是关于Swift - 如何从 UIPickerView 生成数据的许多 UITextField 中读取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 UIPickerView (Swift)?

Swift:点击 UITextField 时如何显示 UIPickerView

如何使用 Swift 3 UIPickerView 引用多行?

如何在 iOS Swift 3 中滚动到 UIPickerView 中的特定行

如何在 Swift 3 的 UIPickerView 中获取所选行的字符串值?

致命错误:索引超出范围 / UIPickerView /Array/ Swift