在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器

Posted

技术标签:

【中文标题】在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器【英文标题】:passing data (json) to another controller in swift 5.2 con Alamofire 【发布时间】:2020-08-13 01:04:28 【问题描述】:

我有一个登录视图,要求输入卡和密码。我咨询了一个 API,如果输入的数据是正确的,它会像这样向我发送JSON。哪个返回有按钮方法?如何将该数据发送到另一个视图?我占用Alamofire 5.0 并有我的Model 课程。

@IBAction func myButtonIngresarAction(_ sender: Any) 
    
    guard let carnet = self.txtCarnet.text else return
    guard let contrasena = self.txtPassword.text else return
     
    let ingresologinmodel = IngresoLoginModel(usuario: carnet, password: contrasena)
    self.apiCall(IngresoLoginModel: ingresologinmodel)
        
        (result) in
        
        switch result
        case .success(let json):
            print(json)
            **//This is where I want to send that json with the data to the other view. ******
            
            
        case .failure(let err):
            print(err.localizedDescription)
        
    
    


enum ApiErros: Error 
    case custom(message : String)


typealias Handler = (Swift.Result<Any?, ApiErros>) -> Void

func apiCall(IngresoLoginModel: IngresoLoginModel, completionHandler: @escaping Handler)


  let header: HTTPHeaders = [
      .contentType("application/json")
  ]
  
  AF.request("https://url/xxxx/api/Login", method: .post, parameters: IngresoLoginModel,
             encoder: JSONParameterEncoder.default, headers: header).response response in
              debugPrint(response)
              
              switch response.result
              case .success(let data):
                  do
                    
                    let json = try JSONDecoder().decode([LoginModel].self, from: data!)
                    print(json)
  
            if response.response?.statusCode == 200
                        completionHandler(.success(json))
                
                    else
                        completionHandler(.failure(.custom(message: "Por favor verifica tu internet")))
                    
                  
                  catch
                  
                    print(error)
                    completionHandler(.failure(.custom(message: "Problemas")))
                  
              case .failure(let err):
                  print(err.localizedDescription)
              
  

  

类模型

struct LoginModel: Codable 

    let idEmpleado: Int
    let Nombre: String
    let CodEmpleado: String
    let password: String
    let idPerfil: Int
    let activo: Int
    let Descripcion: String
    let idRegion: Int
    let correo: String


这是 Api 发送给我的 json,这些示例中的数据会更改它们


"idEmpleado": 1,
"nombre": “test”,
"codEmpleado": “000000”,
"password": “123”,
"idPerfil": 4,
"activo": 1,
"Descripcion": “test”,
"idregion": 1,
"correo": “test@test.com"

【问题讨论】:

【参考方案1】:

很多方法,比如创建一个变量来将这个 json 保存在 OtherViewController 中并调用 self?.otherViewController.json = json https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

【讨论】:

没错,我已经很清楚了,但这不是字符串,它是第二个控制器中变量必须是什么类型的json,以及我如何访问json的值从第二种观点。感谢您的回答,但我有这些疑问。 @franco00719 将其 json 转换为相应的模型。或者使用它创建变量类型是:Any 当我将其转换为相应的模型时,我现在不知道该怎么做。 对不起,您已经将响应转换为您的 LoginModel,但是当您在 CompletionHandler 中使用它时,您不知道如何使用它?是您的问题吗? @franco00719 更正登录模型我不知道如何将其发送到另一个视图控制器并能够从第二个视图访问每个属性。【参考方案2】:

使用 didSet

var page = [Datas]() 
    didSet 
         self.myVariable = page[0].date!
    

【讨论】:

【参考方案3】:

typealias Handler = (Swift.Result ) -> Void

@IBAction func myButtonIngresarAction(_ sender: Any)

    guard let carnet = self.txtCarnet.text else return
    guard let contrasena = self.txtPassword.text else return
     
    let ingresologinmodel = IngresoLoginModel(usuario: carnet, password: contrasena)
    self.apiCall(IngresoLoginModel: ingresologinmodel)
        
        (result) in
        
        switch result
        case .success(let json):
        print(json)
    
        //Here is that I do not know how to send it to the other controller all the json

        let viewControllerB = HomeMenuViewController()
            viewControllerB.datosPersonales = json!
            self.navigationController?.pushViewController(viewControllerB, animated: true)
            
            
        case .failure(let err):
            print(err.localizedDescription)
        
    
    

第二个控制器

类 HomeMenuViewController: UIViewController

@IBOutlet weak var mylabel: UILabel!

var datosPersonales = [LoginModel]()


override func viewDidLoad() 
    super.viewDidLoad()

    print("***************")
    print(datosPersonales)
    print("***************")

【讨论】:

以上是关于在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 在 Swift 3、Xcode 8 中出现错误

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

在 Swift 中将 Alamofire 结果解析为对象(使用:Alamofire、SwiftyJSON 和 ObjectMapper)

Swift:Alamofire 文档

Alamofire swift 库版本 4.4 未安装在 swift 3.0.2 项目中

如何在 swift 中在 alamofire 中打印错误 html?