Передача данных между контроллерами представления Swift, не работающими при первом переходе - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть файл Swift, содержащий четыре отдельных массива кортежей.В ViewControllerA у меня есть четыре разные кнопки, каждая из которых меняет значение «selectedPosition» и настроена на запуск «SegueAtoB».Затем «selectedPosition» следует использовать в ViewControllerB для выбора подходящего массива для заполнения UIPickerView в ViewControllerB.

В настоящее время метод подготовки к segue передает правильные данные только при правильных данных при втором нажатии кнопки, например, когдаприложение загружается в ViewControllerA. Я нажимаю кнопку, она переводит меня в ViewControllerB, но массив, выбранный для UIPickerView, используется по умолчанию. Когда я возвращаюсь назад в ViewControllerA и нажимаю кнопку, код работает так, как должен.

ViewControllerA:

class ViewControllerA: UIViewController {

    // Variable to hold position selected (passed through to ViewControllerB)
    var selectedPosition : String = ""


    // Button1
    // Set up to run "SegueAtoB"
    @IBOutlet weak var selectButton_CEO: UIButton!
    @IBAction func selectButton_CEO_Tapped(_ sender: UIButton) {
        selectedPosition = "CEO"
    }


    // MARK: - Navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueAtoB" {
            let VC : ViewControllerB = segue.destination as! ViewControllerB
            VC.ReceivePlayerDataDelegate = self
            VC.currentPosition = selectedPosition
        }
    }

}

ViewControllerB:

class ViewControllerB: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {


    // set the position passed through from ViewControllerB
    var currentPosition : String = ""

    // set the playersArray by position
    var posArray = ceoArray


    // Button to dismiss ViewControllerB
    @IBAction func closeButton(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }


    // Picker view
    @IBOutlet weak var posPickerView: UIPickerView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // select appropriate array based on position selected
        selectArray(currentPos: currentPosition)

        // Delegate picker view to self
        posPickerView.delegate = self
        posPickerView.dataSource = self

    }


    // UIPickerViewMethods
    // Set the number of picker columns to 1
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    // Set the number of picker rows to the number of items in posArray
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return posArray
    }

    // Set the title of each picker row to each name in posArray
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return posArray[row].name
    }


    // Picker action
    // What happens when selection is made
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        print(posArray[row])

        // I've removed what's in here as it's not relevant to the question

    }


    // Method to select correct array based on currentPosition -- called in viewDidLoad
    func selectArray(currentPos: String) {

        switch (currentPos) {
        case "CEO" :
            posArray = ceoArray
        case "CFO" :
            posArray = cfoArray
        default :
            posArray = ceoArray
        }

    }


}

Мне нужно обновить UIPickerView до соответствующего массива при первом переходе от ViewControllerA к ViewControllerB, не прибегая кпо умолчанию при первом переходе.

1 Ответ

0 голосов
/ 11 февраля 2019

Если несколько элементов управления приводят к одному и тому же переходу, вам нужно проверить sender в функции prepare(for:).Если это была кнопка CEO, установите строку CEO и т. Д.:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "SegueAtoB",
          let vc = segue.destination as? ViewControllerB,
          let senderButton = sender as? UIButton   else { return }

    vc.ReceivePlayerDataDelegate = self
    if (senderButton === selectButton_CEO) {
        vc.currentPosition = "CEO"
    } else if (senderButton === selectButton_CFO) {
        vc.currentPosition = "CFO"
    } // and so on
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...