我正在尝试从子视图控制器回调到其父视图。传回的值已成功打印,但随后我得到了一个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)
}
Run Code Online (Sandbox Code Playgroud)
我像这样从子控制器回调:
@IBAction func done(sender : AnyObject) {
dismissModalViewControllerAnimated(true)
if let cb = callback {
cb(beatCount)
}
}
Run Code Online (Sandbox Code Playgroud)
对于父控制器中的此功能:
func calculateHeartRate(beats : Int?) {
println("Beats = \(beats)")
if beats {
let heartrate = 60/secondsCount * beats!
println("Heart rate \(heartrate)")
}
}
Run Code Online (Sandbox Code Playgroud)
println 正确输出到控制台,然后我在“if beats {”行上得到一个异常。
做这样的回调有什么本质上的错误吗?
我终于想通了这一点。它与我使用的 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)
}
}
Run Code Online (Sandbox Code Playgroud)
用法
let dataEntryViewController = DataEntryViewController()
dataEntryViewController.callback = {
(beatCount) in
print(beatCount)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |