Почему я не могу выбрать свои первые данные в списке просмотра сборщика? - PullRequest
0 голосов
/ 14 мая 2018

Итак, у меня есть кнопка в контроллере вида, и если я коснусь этой метки, она покажет всплывающее окно, которое на самом деле является видом сборщика.

Я покажу всплывающее окно выбора, используя модально подарок, используя код ниже

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let popup = storyboard.instantiateViewController(withIdentifier: "dataPickerPopup") as! DataPickerPopUpVC
popup.delegate = self
popup.selectionList = ["R16G","R22G"]
popup.titlePopup = "UNITS"
popup.startingData = availableUnits[0]
present(popup, animated: true, completion: nil)

Всплывающее окно выбора будет выглядеть так: enter image description here

Код, который я использую в popupVC, выглядит так:

import UIKit


protocol DataPickerPopupDelegate {
    func selectedValueFromPopUp (data: String)
}



class DataPickerPopUpVC: UIViewController {

    @IBOutlet weak var titlePopupLabel: UILabel!
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var saveButton: UIButton!

    var selectionList : [String]!
    var pickedData = ""
    var startingData = ""
    var titlePopup = ""

    var delegate : DataPickerPopupDelegate?



    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        setPickerViewStartingPosition()
        titlePopupLabel.text = titlePopup

    }


    @IBAction func saveButtonDidPressed(_ sender: Any) {

        // picked data will be sent to caller VC using protocol delegate pattern.

        delegate?.selectedValueFromPopUp(data: pickedData)
        dismiss(animated: true, completion: nil)
    }


    @IBAction func closeReusablePopup(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }




}

extension DataPickerPopUpVC {
    // MARK: - Helper Methods

    func setPickerViewStartingPosition() {
        let index = selectionList.index(of: startingData)
        pickerView.selectRow(index ?? 0, inComponent: 0, animated: false)
    }
}



// MARK: - Picker View Delegate & Data Source
extension DataPickerPopUpVC : UIPickerViewDelegate, UIPickerViewDataSource {

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

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


    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        pickedData = selectionList[row]
    }


    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
        let pickerLabel = UILabel()
        if UIDevice.current.userInterfaceIdiom == .pad {
            pickerLabel.font = UIFont.systemFont(ofSize: 40)
            pickerLabel.text = selectionList[row]
            pickerLabel.textAlignment = .center
        } else if UIDevice.current.userInterfaceIdiom == .phone {
            pickerLabel.font = UIFont.systemFont(ofSize: 25)
            pickerLabel.text = selectionList[row]
            pickerLabel.textAlignment = .center
        }
        return pickerLabel
    }



}

После того, как пользователь нажмет кнопку «Выбрать», он отправит выбранные единицы обратно в VC вызывающего абонента, используя шаблон делегата.

Но у меня здесь что-то не так. Как вы можете видеть, начальная позиция окна выбора всегда будет «R16G». Если я сразу нажму кнопку «выбрать» после того, как появится всплывающее окно, кажется, что оно всегда даст мне пустую строку выбранных данных. Кажется, что didSelectRow не срабатывает.

Но если я прокручиваю вниз от "R16G" до "R22G" и затем нажимаю кнопку "выбрать", это даст строку "R22G". У меня нет проблем, если я выберу R22G.

И если я прокрутите вниз от «R16G» до «R22G», а затем снова вернусь к «R16G», а затем нажмите кнопку «Выбрать», появится строка «R16G», она будет работать, как я и ожидал.

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

Вот файл .gif моей проблемы: http://g.recordit.co/fRnvVJ2hi0.gif

Как я мог это исправить? Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

didSelectRow вызывается только тогда, когда пользователь фактически взаимодействует со средством выбора для выбора новой строки. Он не вызывается при первоначальном отображении средства выбора, поскольку пользователь не выбрал строку.

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

@IBAction func saveButtonDidPressed(_ sender: Any) {

    // picked data will be sent to caller VC using protocol delegate pattern.
    let pickedData = selectionList[pickerView.selectedRow(inComponent:0)]
    delegate?.selectedValueFromPopUp(data: pickedData)
    dismiss(animated: true, completion: nil)
}

Вам не нужно свойство pickedData или метод делегата didSelect.

0 голосов
/ 14 мая 2018

Вы можете сохранить первое значение массива как выбранное, а в didSelect вы можете обновить эту переменную текущим значением.

Итак, в viewDidLoad () добавьте следующие строки:

if !selectionList.isEmpty {
   pickedData = selectionList[0]
}
...