如何在Swift中查看控制器回调

时间:2014-06-30 09:30:32

标签: 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)
}

我从子控制器那里回电话:

@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 {”行上得到一个例外。

做这样的回调有什么固有的错误吗?

2 个答案:

答案 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中的完成块一样有意义