Заполнение UITextField с опцией UIPickerView немедленно - PullRequest
0 голосов
/ 24 октября 2018

Мое приложение использует UITextField s, которые заполнены UIPickerView s, например, прикрепленный скриншот.Пример их настройки приведен ниже.

В настоящее время при нажатии на UITextField он вызывает UIPickerView, но само поле не заполняется до тех пор, пока не будет прокручена UIPickerView.(например, чтобы заполнить UITextField с помощью «Да, операция» в приведенном ниже примере, пользователь должен сначала перейти к «Да, PCI <6 ч назад», а затем снова выполнить резервное копирование). </p>

Какя получу это так, как только будет нажата UITextField первая строка UIPickerView используется для заполнения поля?

let prevCardiacIntervPickerView = UIPickerView()  
prevCardiacIntervPickerView.delegate = self  
prevCardiacIntervPickerView.tag = 1  
prevCardiacIntervPickerField.inputView = prevCardiacIntervPickerView  
var prevCardiacIntervPickerOption = ["Yes, surgery", "Yes, PCI <6h ago", "Yes, PCI >6h ago", "No"]  
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}  
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption.count
        }
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption[row]
        }
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 1 {
            prevCardiacIntervPickerField.text = prevCardiacIntervPickerOption[row]
        }
}

Example screenshot

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Вы можете изменить следующую функцию на

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if row.index == 1 && textField.text.count == 0 {
            // set titleForRow to the UITextField
        }
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption[row]
        }
}

. Есть проверка, что если UITextfield еще пусто и row.index равно один , тогда значениеtitleForRow должен быть заполнен в обозначенном UITextfield

Другим быстрым решением может быть заполнение UITextField prevCardiacIntervPickerOption[0] в viewDidAppear.Но в этом случае UITextfield будет заполнен значением по умолчанию первого элемента массива.Если вы хотите оставить UITextfield пустым до тех пор, пока он не будет выбран, перейдите к первому решению.

0 голосов
/ 24 октября 2018

Как правило, не очень хорошая идея использовать UITextField в корреляции со средством выбора. Я имею в виду, что если параметры доступны только для выбора, то зачем разрешать свободный текст?Вы могли бы просто использовать выбираемую строку, чтобы открыть средство выбора и иметь значение по умолчанию.

Но если вам нужно именно такое поведение, я бы установил делегат в моем текстовом поле и проверил, если он был пуст при первом нажатии:

self.myTextField.delegate = self

func textFieldDidBeginEditing(_ textField: UITextField) {
  if textField == myTextField && !textField.text {
     textField.text = pickerViewDataSource[0]
  }
}
0 голосов
/ 24 октября 2018

Вам необходимо реализовать метод textFieldShouldBeginEditing:.

Установить делегат

yourTextfield.delegate = self

Реализовать метод делегата

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {


     if (textField == yourTextfield) {  

        // your logic goes here...
        yourTextfield.text = prevCardiacIntervPickerOption.first

     }

   return true
}
...