[英]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.