在 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)