我一直关注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)
}
任何帮助表示赞赏! :)
答案 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的人。我将尝试描述每个细节,使其更加简单一步一步
在故事板中,为segue指定一个标识符,方法是单击segue并转到Attributes Inspector。
使用以下代码创建一个名为“protocol.swift”的文件。
protocol.swift:
protocol setDateValueDelegate {
func setDate(toValue: String)
}
“setDateValueDelegate”和“setDate”可以替换为您想要的任何内容,但它们必须在整个代码中保持一致。
FirstViewController.swift:
class FirstViewController: UIViewController, setDateValueDelegate {
(协议名称,在我的情况下“setDateValueDelegate”必须与protocol.swift中的相同)
将该功能添加到您的第一个视图控制器。
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.
}
将prepareForSegue函数添加到FirstViewController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "DueDate") {
var secondVC: SecondViewController = (segue.destinationViewController as SecondViewController)
secondVC.delegate = self
}
(中的 SecondViewController “var secondVC:SecondViewController”和“,因为SecondViewController”必须替换为您的第二个视图控制器的名称。< / p>
在SecondViewController中添加委托
var delegate:setDateValueDelegate?
/* As before setDateValueDelegate must be replaced to the name that
you gave to your delegate */
在第二个视图控制器的ViewDidLoad中调用委托:
delegate?.setDate(/* The value that you want to send to the FirstViewController*/)
必须将/ * setDate更改为protocol.swift中的函数名称* /
希望这对你们所有人都有帮助! :)
答案 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做任何你想做的事情。希望这有帮助