2017-03-07 40 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