簡體   English   中英

Swift:通過展開segue傳遞的數據在讀取之前已被擦除

[英]Swift : Data passed through unwind segue is erased before being read

我試圖通過展開序列將一個ViewController的Date傳遞給另一個。 問題在於傳遞的數據被Date()的結果替換。

這是選擇日期的VC代碼:

class DateSelectorViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    ...

    @IBAction func validateDate(_ sender: CustomButton) {
        sendDateToNextVC(sender: sender)
    }   

    func sendDateToNextVC(sender: UIButton) {
        let destinationVC = AddActivityViewController()
        destinationVC.dateSelected = dateSelected
        destinationVC.recurrenceType = selectedFrequency
        destinationVC.isRecurrent = recurrent
        performSegue(withIdentifier: "sendSelectedDate", sender: sender)
    } 
}

這是在dateSelected中接收日期的VC代碼:

class AddActivityViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    ...    

    var dateSelected: Date = Date()

    ... 

    @IBAction func unwindToAddActiVC(_ sender: UIStoryboardSegue) {
        if sender.identifier == "sendSelectedDate" {
            setDateLabel()
        }
    } 

    func setDateLabel() {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fr_FR")
        dateFormatter.dateFormat = "dd MMMM yyyy"
        dateLabel.text = dateFormatter.string(from: dateSelected)
    }

}

我說過

var dateSelected: Date = Date()

被多次調用,尤其是在該日期從第一個VC傳遞到目標VC之后。 我嘗試使用可選,但它只會導致明顯的錯誤“ 在展開時發現nil ”。

如果您需要其他代碼,請告訴我。

提前致謝 !!

sendDateToNextVC方法中,創建一個新的AddActivityViewController實例,然后將其丟棄。 iOS對此一無所知,它只是創建了另一個實例。 您將日期設置為創建的實例,而iOS仍在使用其自己的實例。

您應該改用prepareForSegue方法傳遞日期。 而不是自己創建VC,而是從prepareForSegue方法內的Segue對象獲取它。

它看起來像這樣:

class DateSelectorViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    ...

    @IBAction func validateDate(_ sender: CustomButton) {
        sendDateToNextVC(sender: sender)
    }   

    func sendDateToNextVC(sender: UIButton) {
        let destinationVC = AddActivityViewController()
        destinationVC.dateSelected = dateSelected
        destinationVC.recurrenceType = selectedFrequency
        destinationVC.isRecurrent = recurrent
        performSegue(withIdentifier: "sendSelectedDate", sender: sender)
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destinationViewController as? AddActivityViewController {
            destinationVC.dateSelected = dateSelected
            destinationVC.recurrenceType = selectedFrequency
            destinationVC.isRecurrent = recurrent
        }
    }
}

此處有更多詳細信息: SO:如何傳遞prepareForSegue:一個對象

DateSelectorViewController必須重寫,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "sendSelectedDate"{
        var vc = segue.destinationViewController as! AddActivityViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your AddActivityViewController
    }
}

在這里,您實例化了一個新的ViewController,而沒有使用的是Segue

這部分代碼是錯誤的

func sendDateToNextVC(sender: UIButton) {
        let destinationVC = AddActivityViewController()
        destinationVC.dateSelected = dateSelected
        destinationVC.recurrenceType = selectedFrequency
        destinationVC.isRecurrent = recurrent
        performSegue(withIdentifier: "sendSelectedDate", sender: sender)
    } 

實際上,您正在創建一個新的viewController,segue已經完成了工作。

請改用prepareForSegue

 @IBAction func validateDate(_ sender: CustomButton) {
        sendDateToNextVC(sender: sender)
    }

    func sendDateToNextVC(sender: UIButton) {
        performSegue(withIdentifier: "sendSelectedDate", sender: sender)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "sendSelectedDate",
            let destinationVC = segue.destinationViewController as? AddActivityViewController{
            destinationVC.dateSelected = dateSelected
            destinationVC.recurrenceType = selectedFrequency
            destinationVC.isRecurrent = recurrent
        }
    }

在這里,您將獲得在segue中使用的viewcontroller,應該解決您的問題。

希望能幫助到你。

皮埃爾

暫無
暫無

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

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