夫特视图控制器之间传递数据不工作的第一SEGUE过渡

问题描述 投票:0回答:1

我有一个包含元组的四个单独的阵列一个夫特文件。在ViewControllerA我有四个不同的按钮,其中的每一个改变“selectedPosition”的值,并且被设置来触发“SegueAtoB”。 “selectedPosition”然后应在ViewControllerB被用来选择适当的数组来填充上ViewControllerB一个UIPickerView。

目前,我的用于赛格瑞方法制备仅传递正确的数据的按钮被按下第二次,例如当应用程序加载到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进行更新,以在第一SEGUE从ViewControllerA到ViewControllerB相关的数组,而不是诉诸拖欠第一SEGUE。

ios swift segue
1个回答
0
投票

如果多个控件导致相同SEGUE,您需要检查senderprepare(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
}
© www.soinside.com 2019 - 2024. All rights reserved.