从视图控制器传回日期

时间:2014-12-24 03:45:44

标签: ios xcode swift uiviewcontroller delegates

我一直关注this thread,但代码没有显示任何错误,但是当我在手机上运行时,应用程序崩溃了,我收到SIGABRT信号错误,可能是什么原因造成的?这是我的代码:

FirstViewController.swift:

class FirstViewController: UIViewController, UITextFieldDelegate, setDateValueDelegate{

func setDate(value: String) {
    self.receivedDate = value
}

@IBOutlet weak var dateButton: UIButton!
var receivedDate:String = ""

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var secondVC = (segue.destinationViewController.visibleViewController as  SecondViewController)
    secondVC.delegate = self
}

SecondViewController.swift:

protocol setDateValueDelegate {
  func setDate(value: String)
}

class SecondViewController: UIViewController {

var delegate: setDateValueDelegate?
@IBOutlet weak var datePicker: UIDatePicker!

var strDate:String = ""

func datePickerChanged(datePicker:UIDatePicker) {
    var dateFormatter = NSDateFormatter()

    dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle

    strDate = dateFormatter.stringFromDate(datePicker.date)
    dateLabel.text = strDate

    delegate?.setDate(strDate)
}

任何帮助表示赞赏! :)

3 个答案:

答案 0 :(得分:0)

因为它实际上并非#34;可见"但是,您的segue.destinationViewController.visibleViewController行无法获取即将被激活的SecondViewController实例的实例;因此,我认为问题是你从未真正设置代表。

尝试删除prepareForSegue属性并尝试更新visibleViewController方法,只需获取segue' destinationViewController,如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var secondVC = segue.destinationViewController as  SecondViewController
    secondVC.delegate = self
}

修改:如果您还没有尝试将代理人的协议设置在SecondViewController的顶部:

// set up the setDateValueDelegate protocol with the set date function
protocol setDateValueDelegate {
    func setDate(value: String)
}

class SecondViewController: UIViewController {

    var delegate: setDateValueDelegate?

答案 1 :(得分:0)

所以,我将回答我自己的问题,同时回答任何其他想要将数据从ViewController B传递给ViewController A的人。我将尝试描述每个细节,使其更加简单一步一步

  1. 在故事板中,为segue指定一个标识符,方法是单击segue并转到Attributes Inspector。

  2. 使用以下代码创建一个名为“protocol.swift”的文件。

  3. protocol.swift:

    protocol setDateValueDelegate {
    func setDate(toValue: String)
    }
    

    “setDateValueDelegate”和“setDate”可以替换为您想要的任何内容,但它们必须在整个代码中保持一致。

    1. 在FirstViewController类中,实现协议。
    2. FirstViewController.swift:

      class FirstViewController: UIViewController, setDateValueDelegate {
      

      (协议名称,在我的情况下“setDateValueDelegate”必须与protocol.swift中的相同)

      1. 将该功能添加到您的第一个视图控制器。

        func setDate(toValue:String) {  //setDate must be replaced to the name of your function in the protocol.swift file.
        var date = toValue // The value that is being received from the SecondViewController.
        
        }
        
      2. 将prepareForSegue函数添加到FirstViewController:

        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if(segue.identifier == "DueDate") {
        
        var secondVC: SecondViewController = (segue.destinationViewController as SecondViewController)
        
        secondVC.delegate = self
        
        }
        
      3. 中的 SecondViewController “var secondVC:SecondViewController”“,因为SecondViewController”必须替换为您的第二个视图控制器的名称。< / p>

        1. 在SecondViewController中添加委托

          var delegate:setDateValueDelegate?
          /* As before setDateValueDelegate must be replaced to the name that
          you gave to your delegate */
          
        2. 在第二个视图控制器的ViewDidLoad中调用委托:

              delegate?.setDate(/* The value that you want to send to the FirstViewController*/)
          
          必须将

          / * setDate更改为protocol.swift中的函数名称* /

        3. 希望这对你们所有人都有帮助! :)

答案 2 :(得分:0)

我这样做了

FirstViewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    var SecondVC: SecondViewController = segue.destinationViewController as SecondViewController

    if segue.identifier == "Player2Button"{
        SecondVC.NumberOfPlayers = 2
    }else{
        SecondVC.NumberOfPlayers = 1
    }

}

SecondViewController

只需使用NumberOfPlayers做任何你想做的事情。希望这有帮助