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】:
看看UITextView
delegate。您可以使用textFieldDidBeginEditing(_ textField: UITextField)
来检测是否选择了文本字段(成为第一响应者)。
然后使用textField
参数来检测选择了哪个文本字段,并据此加载选择器数据。
【讨论】:
以上是关于Swift - 如何从 UIPickerView 生成数据的许多 UITextField 中读取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Swift:点击 UITextField 时如何显示 UIPickerView
如何使用 Swift 3 UIPickerView 引用多行?
如何在 iOS Swift 3 中滚动到 UIPickerView 中的特定行