Как изменить палитру inputView при нажатии на другое textField? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть несколько 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)
}

}

...