У меня есть несколько textField и я выбираю их в качестве inputView. Это работает нормально, когда я нажимаю textField, а затем нажмите другой вид, чтобы закрыть средство выбора. Проблема заключается в том, когда я нажимаю текстовое поле, а затем нажимаю другое текстовое поле. Сборщик меняет представление, но кажется, что подсчет данных был неверным. Сообщение показывает «Тема 1: Неустранимая ошибка: Индекс выходит за пределы диапазона». Теперь я использую 4 UIPickerView, чтобы обойти это. Могу ли я иметь какой-либо способ использовать только один UIPickerView, который будет входным для нескольких текстовых полей с разными источниками данных? Я думаю, что способ закрыть входное представление, прежде чем другой textField был коснулся. Пожалуйста помоги. Спасибо.
ниже указан код
class NotificationSearchCustomerViewController: UIViewController, UIScrollViewDelegate,
UITextFieldDelegate{
let meals = ["a","b","c",""]
let citys = ["d","e","f","g","h","i","j","k"]
let years = ["1","2","3","4","5"]
@IBOutlet weak var birthdayTextField: UITextField!
@IBOutlet weak var cityTextField: UITextField!
@IBOutlet weak var paymonthTextField: UITextField!
@IBOutlet weak var insurancePeriodTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
setTextFieldInputView()
birthdayTextField.delegate = self
cityTextField.delegate = self
paymonthTextField.delegate = self
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
self.view.addGestureRecognizer(tap)
}
@objc func hideKeyboard(){
self.view.endEditing(false)
}
func setTextFieldInputView(){
let myPickerView1 = UIPickerView()
let myPickerView2 = UIPickerView()
let myPickerView3 = UIPickerView()
let myPickerView4 = UIPickerView()
myPickerView1.delegate = self
myPickerView1.dataSource = self
myPickerView2.delegate = self
myPickerView2.dataSource = self
myPickerView3.delegate = self
myPickerView3.dataSource = self
myPickerView4.delegate = self
myPickerView4.dataSource = self
birthdayTextField.inputView = myPickerView1
cityTextField.inputView = myPickerView2
paymonthTextField.inputView = myPickerView3
insurancePeriodTextField.inputView = myPickerView4
}
//if use four pickerView, this func can be delete.
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.inputView?.reloadInputViews()
if textField == birthdayTextField{
birthdayTextField.becomeFirstResponder()
for i in 0 ..< months.count{
if months[i] == textField.text{
let picker = birthdayTextField.inputView as? UIPickerView
picker?.selectRow(i, inComponent: 0, animated: false)
break
}
}
}else if textField == cityTextField{
cityTextField.becomeFirstResponder()
for i in 0 ..< citys.count{
if citys[i] == textField.text{
let picker = textField.inputView as? UIPickerView
picker?.selectRow(i, inComponent: 0, animated: false)
break
}
}
}else if textField == paymonthTextField{
paymonthTextField.becomeFirstResponder()
for i in 0 ..< months.count{
if months[i] == textField.text{
let picker = paymonthTextField.inputView as? UIPickerView
picker?.selectRow(i, inComponent: 0, animated: false)
break
}
}
}
}
func textFieldDidEndEditing(_ textField: UITextField){
self.view.endEditing(true)
}
}
extension NotificationSearchCustomerViewController: UIPickerViewDelegate, UIPickerViewDataSource{
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if(birthdayTextField.isFirstResponder || paymonthTextField.isFirstResponder){
return meals.count
}else if(cityTextField.isFirstResponder){
return drinks.count
}else if(insurancePeriodTextField.isFirstResponder){
return years.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView,
titleForRow row: Int,
forComponent component: Int) -> String? {
if(birthdayTextField.isFirstResponder || paymonthTextField.isFirstResponder){
return meals[row]
}else if(cityTextField.isFirstResponder){
return drinks[row]
}else if(insurancePeriodTextField.isFirstResponder){
return years[row]
}
return ""
}
func pickerView(_ pickerView: UIPickerView,
didSelectRow row: Int, inComponent component: Int) {
if(birthdayTextField.isFirstResponder){
birthdayTextField.text = meals[row]
}else if(cityTextField.isFirstResponder){
cityTextField.text = drinks[row]
}else if(paymonthTextField.isFirstResponder){
paymonthTextField.text = meals[row]
}else if(insurancePeriodTextField.isFirstResponder){
insurancePeriodTextField.text = years[row]
}
self.view.endEditing(true)
}
}