簡體   English   中英

將數據從第一個VC傳遞到第三個VC(Swift)

[英]Pass data from the first VC to the third (Swift)

我有3個viewControllers,我以這種方式將數據從第一個傳遞到第二個(這是第一個VC)

 var steppers : UIStepper?

    @IBOutlet weak var hourLabel: UILabel!
    @IBOutlet weak var stepper: UIStepper!

    @IBAction func stepper(_ sender: UIStepper) {

      hourLabel.text = String(sender.value)
    }


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nc = segue.destination as? SelectClass {
            nc.limit = Int(stepper.value)
        } }

在第二個VC中,我的var limit = 0 直到這里一切都工作良好,但我要做的是將用戶提供給步進器的值傳遞給第三個VC。 我試圖在第三個VC var limit2 = 0創建另一個變量,並以這種方式將數據從第二個VC傳遞到第三個VC。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? ThirdClass {
            vc.limit2 = limit
        } }

但沒有結果,我的var limit2 = 0它始終具有值0,而不是采用步進器添加的值。 我能怎么做?

這是第二個VC中的准備

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == nearbySearchSegueIdentifier {
            guard let category = sender as? QCategoryy else {
                return
            }
            if let selectedRows = tableView.indexPathsForSelectedRows {

                if let vc = segue.destination as? ThirdClass {
                vc.category = category
                vc.limit2 = limit
            }
        }
    }
}

從第一到第二到第三,你為什么不通過?

FirstVC:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "tosecondsegue" {
          let itemController : Second = segue.destination as! Second
          itemController.limit = 0 //Whatever you want
    }
}

SecondVC:

var limit = 0

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       if segue.identifier == "tothirdsegue" {
            let itemController : ThirdVC = segue.destination as! ThirdVC
            itemController.limit2 = limit
       }
}

ThirdVC:

 var limit2 = 0

//Use it here now

考慮到您當前的代碼 ,因為此條件無效,可能未設置limit2

// This condition could be failing sometimes
if let selectedRows = tableView.indexPathsForSelectedRows {
    if let vc = segue.destination as? ThirdClass {
        vc.category = category
        vc.limit2 = limit
    }
}

根據文檔indexPathsForSelectedRows返回一個可選值,並且在您的設置中,如果該值不為nil,則僅設置limit2

嘗試將 limit2 設置在任何條件之外,因此它將始終執行,如果您需要滿足條件才能進行segue ,請在此處檢查shouldPerformSegue(withIdentifier:sender:)

另外,如果在VC3上需要的值與離開VC1時的值相同,則可以使用不同的方法在它們之間傳遞數據,而不必依賴VC2。

一種可能是在VC1中創建一個靜態變量並設置極限值,然后再推送到VC​​2:

var steppers : UIStepper?

    @IBOutlet weak var hourLabel: UILabel!
    @IBOutlet weak var stepper: UIStepper!

    // ADD THIS
    static var globalLimit: Int = 0

    @IBAction func stepper(_ sender: UIStepper) {
      hourLabel.text = String(sender.value)
    }


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let nc = segue.destination as? SelectClass {
            nc.limit = Int(stepper.value)
            // AND THIS
            VC1ClassName.globalLimit = Int(stepper.value)
        } 
}

然后在VC3內部隨時隨地加載您的全局值(也許是viewDidLoad ):

override func viewDidLoad() {
    super.viewDidLoad()
    limit2 = VC1ClassName.globalLimit
}

除了讓數據通過ViewControllers傳遞之外,您還可以創建一個StepperManager類或類似的負責數據管理的類,並且可以隨時從所需的每個類中訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM