UIPickerView Несколько строк отображаются в UITextField - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь отобразить свой UIPickerView в TextField, я сделал это, чтобы он отображал одну из строк, но не все из них.

Вот мой код:

class ViewController: UIViewController {

static var isAlreadyLaunchedOnce = false
var ref: DatabaseReference!


    @IBOutlet weak var txtDate: UITextField!


    @IBOutlet weak var inputpickerdate: UIPickerView!



    var pickerDate: [[String]] = [[String]] ()


    var selected: String?

    override func viewDidLoad() {
        super.viewDidLoad()

    self.inputpickerdate.delegate = self
    self.inputpickerdate.dataSource = self

        pickerDate = [["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]]

        if FirebaseApp.app() == nil {
            FirebaseApp.configure()
        }



}

extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {

    return 3

    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            //return pickerList.count
        return pickerDate [component].count

        }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        return pickerDate [component] [row]

   }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        txtDate.text = pickerDate[component][row]
        self.view.endEditing(false)

    }

    }

В текстовом просмотре я вижу только месяц, а не полную дату, я хочу показать что-то вроде:

понедельник год

Не уверен, как это сделать, в основном нужно показать все строки, а не только одну.

1 Ответ

0 голосов
/ 14 марта 2019

Причина в том, что вы устанавливаете текст в UITextField только для текста компонента, который вы выбираете pickerDate[component][row].

Есть несколько способов добиться того, что вы хотите сделать с помощью UIPicker, хотя и довольно запутанно ...

, например

  • У вас может быть три метки, по одной для каждого компонента.
  • Вы можете сохранить выбор каждого компонента, а затем создать строку из постоянных значений.

Гораздо лучший способ выбрать даты - использовать UIDatePicker.

class ViewController: UIViewController {

    @IBOutlet weak var txtDate: UITextField!
    @IBOutlet weak var datepicker: UIDatePicker!

    let dateFormatter = DateFormatter()

    override func viewDidLoad() {
        super.viewDidLoad()

        dateFormatter.dateStyle = .medium
        datepicker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
    }

    @objc func dateChanged(_ sender: UIDatePicker) {
        txtDate.text = dateFormatter.string(from: sender.date)
    }
}

Если вы хотите пойти по пути использования UIPickerView, вы можете сохранить значение каждого компонента и использовать эти значения для построения строки, которую вы хотите отобразить.

class ViewController: UIViewController {

    @IBOutlet weak var txtDate: UILabel!
    @IBOutlet weak var picker: UIPickerView!

    let pickerData: [[String]] = [
        ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
        ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"],
        ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]
    ]

    var weekDay: String = ""
    var dayOfMonth: String = ""
    var month: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        self.picker.delegate = self
        self.picker.dataSource = self

        // Give the label a default value
        weekDay = pickerData[0][0]
        dayOfMonth = pickerData[1][0]
        month = pickerData[2][0]

        updateDateText()
    }

    func updateDateText() {
        txtDate.text = "\(weekDay) \(dayOfMonth) \(month)"
    }
}

extension ViewController: UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return pickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData [component].count
    }
}

extension ViewController: UIPickerViewDelegate {

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return pickerData[component][row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        switch component {
        case 0:
            weekDay = pickerData[component][row]
        case 1:
            dayOfMonth = pickerData[component][row]
        case 2:
            month = pickerData[component][row]
        default:
            break
        }

        updateDateText()
    }
}
...