Swift - как читать данные из многих UITextFields, которые генерируют данные по UIPickerView

У меня проблема, когда я пытался читать данные из UITextFields.

enter image description here

У меня есть 3 IBOutlets для текстовых полей (секс, цель и количество блюд в день). Данные для всех этих текстовых полей будут отображаться с помощью UIPickerView. Я подготовил 3 набора данных, различный для всех текстовых полей. Когда я нажимаю на 1st textField (Sex), у меня есть PickerView с данными (мужчина и женщина), после этого, когда я нажимаю на 2-й текстовый экран (Цель), DataSet на UIPickerView не был перезагружен, но когда я нажал на третий текстовый экран (количество блюд ) данные pickerView перезагружаются данными для второго текстового поля. Когда я выбираю что-то из этого pickerView 2nd textFieled устанавливаются (после нажатия на 3rd textField!). Он всегда работает так же. Любая идея?

-6
источник поделиться
2 ответа

Вы можете установить pickerView как textField.inputView.

Ниже приведен пример двух текстовых полей, разделяющих одно представление выбора, но вы можете легко его расширить, проверив идентификатор activeTextField в методах делегатов представления picker.

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.

0
источник

Посмотрите на делегат UITextView. Вы можете использовать textFieldDidBeginEditing(_ textField: UITextField) чтобы определить, было ли выбрано текстовое поле (стало первым ответчиком).

Затем используйте параметр textField чтобы определить, какое текстовое поле было выбрано, и данные о textField на основе этого.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос