2017-03-07 71 views
0

我嘗試通過展開segue從ViewController傳遞Date給另一個Date。問題是傳遞的數據被日期()的結果取代。Swift:通過展開segue傳遞的數據在被讀取之前被擦除

這裏就是日期選擇的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) 
    } 
} 

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

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() 

被稱爲多重t imes,尤其是在日期從第一個VC傳遞到目標VC之後的一次。我嘗試使用可選,但它只會導致明顯的錯誤「發現零,而解包」。

如果您需要其他代碼,請讓我知道。

在此先感謝!

回答

0

這裏你實例化一個新的的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使用的視圖 - 控制,你的問題應該得到解決。

希望它有幫助。

Pierre

+1

雖然我得到了使用標題添加結構到文本,在您的答案中有所有應有的尊重有更多的標題比文本。請嘗試減少標題的使用。想象一下,如果所有的答案都是這樣的。這將是很難閱讀。不過,謝謝你的回答,這是正確的。 – FreeNickname

+1

非常感謝您的幫助! – Jonathan

0

在你的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: How to pass prepareForSegue: an object

+0

非常感謝您的幫助! – Jonathan

0

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 
    } 
} 
+0

非常感謝您的幫助! – Jonathan