【问题标题】:Return value for method from closure in SwiftSwift 中闭包方法的返回值
【发布时间】:2015-06-09 16:52:17
【问题描述】:

有没有一种方法可以从我的闭包中返回 shouldPerformSegueWithIdentifier 方法的值?还是我应该换一种方式?

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {

    getDataFromSomewhere() { succeeded, data in
        if succeeded {
            // Should return true here            
        } else {
            self.errorAlert("Error", message: "Can't get data...")
            // Should return false here
        }
    }

}

【问题讨论】:

    标签: ios swift cocoa-touch


    【解决方案1】:

    您不能让shouldPerformSegueWithIdentifier:sender: 从您放置// Should return true here 的位置返回。你需要这样做:

    override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
        var returnValue: Bool = false
    
        getDataFromSomewhere() { succeeded, data in
            if succeeded {
                returnValue = true
            } else {
                self.errorAlert("Error", message: "Can't get data...")
                returnValue = false
            }
        }
    
        return returnValue
    }
    

    请注意,这仅在getDataFromSomewheregetDataFromSomewhere 返回之前执行闭包时才有效。如果getDataFromSomewhere 存储了闭包,并安排稍后调用它(例如,在异步网络请求之后),那么这将不起作用。它只会使 shouldPerformSegueWithIdentifier:sender: 返回您用于初始化 returnValue 的值。

    【讨论】:

    • 谢谢!很有帮助!
    【解决方案2】:

    如果你的 getDataFromSomewhere 闭包是异步的,那么除了使用完成处理程序之外你没有其他解决方案。

    override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?, , completion: @escaping ((Bool) -> Void)) {
        getDataFromSomewhere() { succeeded, data in
            if succeeded {
                completion(true)
            } else {
                self.errorAlert("Error", message: "Can't get data...")
                completion(false)
            }
        }
    }
    

    【讨论】:

    • shouldPerformSegueWithIdentifier 是一个覆盖,因此更改其签名将阻止系统调用它。
    • 啊好吧我没注意到,谢谢。
    【解决方案3】:

    你反对使用 prepareforsegue 和 unwind segue 吗?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "fuelButtonUnhide"{
    
            if let vc = segue.destinationViewController as? DateViewController {
    
                vc.fuelHidden = false
            }
        } 
    }
    
    @IBAction func unwindDateViewToAddFuel(segue: UIStoryboardSegue){
        //Change any data from the date view here
        println("Hit done from date view")
    }
    

    您可以在 prepareforsegue 中传递数据并在 unwind 操作中检索数据。

    【讨论】:

    • 事实并非如此。我需要知道我能否从关闭中返回“方法返回”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多