【问题标题】:How to do View Controller callback in Swift如何在 Swift 中执行 View Controller 回调
【发布时间】:2014-06-30 09:30:31
【问题描述】:

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

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

【问题讨论】:

    标签: cocoa swift


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你应该像

      这样解开可选的
         if let beatCount = beats {
              let heartrate = 60/secondsCount * beatCount
      
              println("Heart rate \(heartrate)")
          }
      

      但我建议您使用Closures 而不是函数。尽管函数是一种特殊的闭包,但 closure 的使用就像 ObjC 中的完成块一样有意义

      【讨论】:

      • 像这样展开可选选项只是为了方便。它不会改变它的工作方式。无论如何我都试过了,它没有任何区别。我也尝试使用闭包,它也没有任何区别。我仍然得到异常。
      • 同一行出现异常?除了例外,您还有什么有用的信息吗?
      • 我得到的只是“EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      相关资源
      最近更新 更多