如何在 Swift 中执行视图控制器回调

zor*_*o2b 2 cocoa swift

我正在尝试从子视图控制器回调到其父视图。传回的值已成功打印,但随后我得到了一个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 {”行上得到一个异常。

做这样的回调有什么本质上的错误吗?

zor*_*o2b 5

我终于想通了这一点。它与我使用的 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)