【问题标题】:How to pass data between two ViewController using closure如何使用闭包在两个 ViewController 之间传递数据
【发布时间】:2017-06-14 09:32:14
【问题描述】:

我想知道如何使用闭包传递数据。我知道有三种类型的数据传递方法:

  • 委托

  • 通知中心

  • 关闭

我想通过一个例子来适当地澄清闭包。

【问题讨论】:

  • 你已经尝试过什么?提供一些代码。这不是代码编写社区。谢谢
  • 虽然我在下面为您提供了示例,但您不应该要求提供代码。相反,您应该尝试,任何混乱/问题都应该在这里解决!
  • 我认为这个问题是无效的。对于语法,您可以访问文档页面。块文档在这里:stackoverflow.com/documentation/ios/6888/…
  • 同意@Joshua,虽然我提供了所需的代码,但我也认为这不是一个共享确切代码的平台,因为Apple提供了详细的文档。

标签: ios iphone swift swift3 closures


【解决方案1】:

使用块/闭包传递数据是一种很好且合理的方法,比通知要好得多。 下面是相同的代码。

第一个 ViewController(在其中创建第二个 ViewController 的对象)

 @IBAction func push(sender: UIButton) {
        let v2Obj = storyboard?.instantiateViewControllerWithIdentifier("v2ViewController") as! v2ViewController
        
        v2Obj.completionBlock = {[weak self] dataReturned in
            //Data is returned **Do anything with it **
            print(dataReturned)
        }
        navigationController?.pushViewController(v2Obj, animated: true)
        
    }

第二个 ViewController(数据传回给第一个 VC)

import UIKit
typealias v2CB = (infoToReturn :String) ->()
class v2ViewController: UIViewController {
        var completionBlock:v2CB?
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func returnFirstValue(sender: UIButton) {
        guard let cb = completionBlock else {return}
        cb(infoToReturn: "any value")
    }
    
}

【讨论】:

  • "completionBlock = {(dataReturned) -> ()in" 这是什么??
  • 它是你在变量 dataReturned 中获取数据的地方
  • 你能给我解释一下传递任何实际数据吗?
  • 在第二个 VC 中,使用 -> cb(infoToReturn: returnFirstValue) 将数据传回第一个 VC。
  • 感谢 Ankit
【解决方案2】:

这个例子解释了使用 Alamofire 调用服务并将响应发送回调用 View Controller 并关闭。

服务包装类中的代码:

关闭声明

typealias CompletionHandler = (_ response: NSDictionary?, _ statusCode: Int?, _ error: NSError?) -> Void

方法中的闭包实现

    func doRequestFor(_ url : String, method: HTTPMethod, dicsParams : [String: Any]?, dicsHeaders : [String: String]?, completionHandler:@escaping CompletionHandler) {

        if !NetworkReachablity().isNetwork() {
            return
        }

        if (dicsParams != nil) {print(">>>>>>>>>>>>>Request info url: \(url) --: \(dicsParams!)")}
        else {print(">>>>>>>>>>>>>Request info url: \(url)")}

        Alamofire.request(url, method: method, parameters: dicsParams, encoding:
            URLEncoding.default, headers: dicsHeaders)

        .responseJSON { response in
            self.handleResponse(response: response, completionHandler: completionHandler)
        }
    }

调用视图控制器的代码:

        ServiceWrapper().doRequestFor(url, method: .post, dicsParams: param, dicsHeaders: nil) { (dictResponse, statusCode, error) in

        }

【讨论】:

  • 哥又读了我的问题。我想传递本地数据而不是 JSON 数据格式
  • 兄弟怎么了?在我发布的示例中,Service Wraper 类使用闭包将数据传递给调用 viewcontroller。如果我错了,请纠正我。
  • @Sagarvaishnav,你的问题中没有本地数据的迹象,而且你可以传递你想要的任何数据,我发布的只是一个例子,而不是你需要的确切数据。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2019-09-17
  • 2015-09-13
  • 1970-01-01
  • 2017-12-27
  • 2016-03-20
相关资源
最近更新 更多