【问题标题】:Passing date back from view controller从视图控制器传回日期
【发布时间】:2015-02-22 05:37:36
【问题描述】:

我一直在关注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)
}

感谢任何帮助! :)

【问题讨论】:

  • 这个类是叫 DatePickerViewController 还是 SecondViewController?
  • @LyndseyScott 已修复!它的实际名称是 DatePickerViewController,但它在帖子中被替换了,以便在这里的用户更容易阅读。
  • 哦,好的。很高兴听到它已修复。 :)
  • @LyndseyScott 哦,问题依旧,我修正的是 ViewController 的名称,实际上是错字。
  • 明白了。你在什么时候真正得到错误?什么时候设置日期?

标签: ios xcode swift uiviewcontroller delegates


【解决方案1】:

由于它实际上还不是“可见的”,因此您的 segue.destinationViewController.visibleViewController 行无法获取即将生效的 SecondViewController 实例的实例;因此,我认为问题在于您从未真正设置过委托。

尝试通过删除visibleViewController 属性来更新您的prepareForSegue 方法,然后简单地获取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?

【讨论】:

  • 我删除了 visibleViewController 应用仍然崩溃:(
  • @OmarDlhz 您在datePickerChanged 方法中添加到dateLabel 的文本是否正确显示?
  • 是的,在我尝试将数据从一个 VC 传递到另一个 VC 之前,文本已正确显示。
  • 在哪里以及如何?对不起我的无知。我有一个名为 protocol.swift 的单独文件
  • 哦,我看到您的协议中已经有了该代码。你导入了吗?也许那不是问题……如果我想到其他任何事情,我会告诉你的……
【解决方案2】:

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

  1. 在您的故事板中,为您的 segue 提供一个标识符,这是通过单击 segue 并转到 Attributes Inspector 来完成的。

  2. 创建一个名为“protocol.swift”的文件,其中包含以下代码。

protocol.swift:

protocol setDateValueDelegate {
func setDate(toValue: String)
}

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

  1. 在您的 FirstViewController 类中,实现协议。

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
    
    }
    

(SecondViewController in "var secondVC: SecondViewController""as SecondViewController" 必须替换为您的 Second View Controller 的名称。

  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】:

    我是这样做的

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

    第二视图控制器

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

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多