Swift中如何将Alamofire请求结果传递至含UIWebView的UIViewController
嗨,这个需求我之前做支付功能的时候也碰到过,给你分享几个实用的实现方式,顺便说下怎么处理那个表单字符串的加载:
1. 直接通过ViewController初始化传参(最常用的方式)
首先给你的UIWebView所在的ViewController加个属性,专门用来存表单字符串:
class WebPaymentViewController: UIViewController { @IBOutlet weak var paymentWebView: UIWebView! // 用来接收表单HTML字符串的属性 var paymentFormHTML: String? override func viewDidLoad() { super.viewDidLoad() // 页面加载完成后,把表单加载到WebView里 if let htmlContent = paymentFormHTML { paymentWebView.loadHTMLString(htmlContent, baseURL: nil) } } }
然后在你用Alamofire拿到返回结果的地方,初始化这个VC并传值:
// 假设你已经从返回数据里解析出了paymentData字符串 if let targetPaymentData = parsedOperation?.paymentData { let webVC = WebPaymentViewController() webVC.paymentFormHTML = targetPaymentData // 根据你的页面跳转方式,用push或者present navigationController?.pushViewController(webVC, animated: true) // 如果是present的话:present(webVC, animated: true) }
2. 用Storyboard Segue传值(如果用可视化布局的话)
如果你是用Storyboard管理页面跳转,先给两个VC之间的Segue设置一个标识符(比如ShowPaymentWebView),然后在源VC里重写prepare(for:sender:)方法传值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "ShowPaymentWebView", let webVC = segue.destination as? WebPaymentViewController, let paymentData = sender as? String else { return } webVC.paymentFormHTML = paymentData } // 拿到Alamofire返回数据后触发Segue if let targetPaymentData = parsedOperation?.paymentData { performSegue(withIdentifier: "ShowPaymentWebView", sender: targetPaymentData) }
3. 优化:让表单自动提交(提升用户体验)
你拿到的paymentData是一个表单HTML,通常用户需要手动点击提交按钮才能跳转到支付页面,这体验不太好。可以给HTML字符串加一段自动提交的JS脚本,让WebView加载完成后自动提交表单:
// 给原始表单HTML追加自动提交脚本 var autoSubmitHTML = targetPaymentData autoSubmitHTML += "<script>document.forms[0].submit();</script>" // 把处理后的HTML传给WebVC webVC.paymentFormHTML = autoSubmitHTML
补充:规范解析Alamofire返回数据
建议用Codable来解析返回的JSON数据,这样代码更清晰易维护,先定义对应的模型:
// 对应返回结果的模型结构 struct PaymentResponse: Codable { let result: ResultModel let operation: [OperationModel] } struct ResultModel: Codable { let code: String let description: String } struct OperationModel: Codable { let status: Bool let paymentType: Int let orderID: Int let paymentData: String let token: String let user: [UserModel] } struct UserModel: Codable { let user_status: String let userID: Int }
然后在Alamofire的回调里解析:
AF.request("你的请求地址", method: .post, parameters: requestParams) .responseDecodable(of: PaymentResponse.self) { response in switch response.result { case .success(let responseData): // 根据业务逻辑取对应的operation里的paymentData,这里取第一个示例 if let paymentData = responseData.operation.first?.paymentData { // 跳转到WebVC并传值 let webVC = WebPaymentViewController() webVC.paymentFormHTML = paymentData navigationController?.pushViewController(webVC, animated: true) } case .failure(let error): print("请求失败:\(error.localizedDescription)") } }
内容的提问来源于stack exchange,提问作者Nazar
相关产品推荐
相关产品推荐

