UIPickerView не возвращает правильную строку, выбранную пользователем - PullRequest
0 голосов
/ 29 августа 2018

Так что я просто использовал этот пост , чтобы добавить вторую pickerView к моему ViewController. Я использовал ответ пользователя «LAOMUSIC Arts», который реализовал идею использования тегов из принятого решения.

Вот моя реализация:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{
    var molyRow = ""
    var tungRow = ""

    var molyPickerViewOptions = ["mils", "mm", "in."]
    var tungPickerViewOptions = ["mils", "mm", "in."]



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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return molyPickerViewOptions.count
        }else{
            return tungPickerViewOptions.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            molyRow = "\(molyPickerViewOptions[row])"
            print("molyRow = ", "\(molyPickerViewOptions[row])")
            return "\(molyPickerViewOptions[row])"

        }else{
            tungRow = "\(tungPickerViewOptions[row])"
            print("tungRow = ", "\(tungPickerViewOptions[row])")
            return "\(tungPickerViewOptions[row])"
        }
    }

Как видите, у меня есть печать tungRow и molyRow вместе с соответствующими значениями. Таким образом, когда я запускаю приложение в симуляторе, я вижу, какое значение оно приобретает.

Когда я попробовал это, я наткнулся на что-то действительно странное. Он будет правильно возвращать «mils» и «mm», когда они выбраны в симуляторе, но если я «пролистываю» из строки «mils» или «mm» вниз до «in». ряд, по какой-то причине вернет "милс". Я приложу видео, чтобы показать вам.

Видео

Как вы можете видеть, сборщик, похоже, правильно возвращает «мил» и «мм» в большинстве случаев времени, однако на основе как я «щелкаю» сборщиком » в." не всегда будет возвращено, когда это необходимо.

Пожалуйста, дайте мне знать, если я смогу сделать этот пост лучше, конкретнее и т. Д.

С нетерпением жду ответа. Заранее спасибо!

РЕДАКТИРОВАТЬ: Получив предложение попробовать pickerView(_:didSelectRow:inComponent:), я попытался реализовать функцию как возврата, так и печати номера строки. Я отредактировал функцию pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) так, что она просто устанавливает заголовок:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            return "\(molyPickerViewOptions[row])"

        }else{
            return "\(tungPickerViewOptions[row])"
        }
    }

    private func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) -> Int{
        if (pickerView.tag == 1){
            molyRow = row
            print("molyRow = ", "\(row)")
            return row

        }else{
            tungRow = row
            print("tungRow = ", "\(row)")
            return row
        }
    }

Обратите внимание, что когда я попытался реализовать функцию pickerView(_:didSelectRow:inComponent:), Xcode предупредил меня: Instance method 'pickerView(_:didSelectRow:inComponent:)' nearly matches optional requirement 'pickerView(_:didSelectRow:inComponent:)' of protocol 'UIPickerViewDelegate' Make 'pickerView(_:didSelectRow:inComponent:)' private to silence this warning

Я попытался запустить с функцией и без нее private. В любом случае, он по-прежнему не печатает номер строки.

1 Ответ

0 голосов
/ 29 августа 2018

Похоже, вы пытаетесь определить выбор строки в методе pickerView(_:titleForRow:forComponent:). Этот метод вызывается UIKit всякий раз, когда ему нужно определить текст для отображения в строке выбора.

Чтобы узнать, какая строка была выбрана при каждом изменении выбора, вы должны проверить метод pickerView(_:didSelectRow:inComponent:) из UIPickerViewDelegate .

EDIT

Swift не вызывает метод, который вы написали, потому что он не совпадает с сигнатурой метода протокола делегата. pickerView(_:didSelectRow:inComponent:) - это не то же самое, что pickerView(_:didSelectRow:inComponent:) -> Int. Вот почему вы получили предупреждение компилятора о том, что имя метода почти, но не совсем совпадает.

Чтобы UIKit мог видеть метод как тот, который он должен вызывать, вам нужно удалить возврат Int. Если сигнатура метода совпадает, и ваш класс правильно назначен в качестве делегата средства выбора (что, по-видимому, происходит после вызова titleForRow:), тогда UIKit увидит его и вызовет.

...