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
来访问任何文本字段中的文本。
我在尝试从 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
来访问任何文本字段中的文本。