【问题标题】:passing data (json) to another controller in swift 5.2 con Alamofire在 swift 5.2 con Alamofire 中将数据(json)传递给另一个控制器
【发布时间】: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"

}

【问题讨论】:

    标签: ios swift alamofire


    【解决方案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("***************")
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-20
        • 2021-09-22
        • 2020-11-07
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多