我正在尝试从子视图控制器回调到其父级。传回的值会成功打印,但我会得到EXC_BAD_INSTRUCTION
。
在父视图控制器中,我构造子控制器,如下所示:
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
if let vc = storyboard.instantiateViewControllerWithIdentifier("dataEntryView") as? DataEntryViewController {
dataEntryVC = vc
vc.callback = calculateHeartRate
self.presentViewController(dataEntryVC!, animated: true, completion: nil)
}
我从子控制器那里回电话:
@IBAction func done(sender : AnyObject) {
dismissModalViewControllerAnimated(true)
if let cb = callback {
cb(beatCount)
}
}
在父控制器中使用此功能:
func calculateHeartRate(beats : Int?) {
println("Beats = \(beats)")
if beats {
let heartrate = 60/secondsCount * beats!
println("Heart rate \(heartrate)")
}
}
println正确输出到控制台,然后我在“if beats {”行上得到一个例外。
做这样的回调有什么固有的错误吗?
答案 0 :(得分:4)
我终于弄明白了。它与我正在使用的Optionals语法或使用闭包与函数无关。
根本原因是@IBOutlets是弱引用。
当我改变我的"完成"方法立即缓存变量中输入的值一切开始工作:)
<强>初始化强>
class DataEntryViewController: UIViewController {
@IBOutlet var beatsText : UITextField
var callback : ((Int?) -> Void)?
var beatCount : Int?
@IBAction func done(sender : AnyObject) {
beatCount = beatsText.text.toInt()
dismissModalViewControllerAnimated(true)
if let cb = callback {
cb(beatCount)
}
}
<强>用法强>
let dataEntryViewController = DataEntryViewController()
dataEntryViewController.callback = {
(beatCount) in
print(beatCount)
}
答案 1 :(得分:1)
您应该打开可选的
if let beatCount = beats {
let heartrate = 60/secondsCount * beatCount
println("Heart rate \(heartrate)")
}
但我建议您使用Closures
而不是函数。尽管函数是特殊类型的闭包,但closure
的使用与ObjC中的完成块一样有意义