如何将 Alamofire 生成的数据从 tableview 推送到 webview
Posted
技术标签:
【中文标题】如何将 Alamofire 生成的数据从 tableview 推送到 webview【英文标题】:How to push data generated by Alamofire from tableview to webview 【发布时间】:2017-10-26 22:22:36 【问题描述】:我对 Swift 语言有些陌生。因此,我需要一些关于如何将 Alamofire 生成的在线数据从一个视图控制器中的 tableview 推送到位于不同视图控制器中的 webview 的建议。更具体地说,在 JSON 数据中有各种带有“url”标签的元素。我的目标是将这些 url 元素与适当的 tableview 单元格匹配,以便在单击单元格时将用户带到新视图控制器中的 URL。虽然我了解这将如何与数组一起使用,但我使用的 JSON 数据是字典的数据。作为回报,我已经摆弄了一段时间,在网上搜索可能存在的任何教程。作为参考,我在这篇文章中包含了我的代码。任何有关此问题的信息将不胜感激。
class TableViewController: UITableViewController
var responseArray = [[String:Any]]()
var mySong = 0
override func viewDidLoad()
super.viewDidLoad()
Alamofire.request("https://rss.itunes.apple.com/api/v1/us/apple-music/top-songs/all/10/explicit.json").responseJSON response in
if let json = response.result.value as? [String:Any],
let feed = json["feed"] as? [String:Any],
let results = feed["results"] as? [[String:Any]]
print(results)
self.responseArray = results
self.tableView.reloadData()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
override func numberOfSections(in tableView: UITableView) -> Int
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return responseArray.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "top10", for: indexPath)
let song = responseArray[indexPath.row]
cell.textLabel?.text = song["name"] as? String
cell.detailTextLabel?.text = song["artistName"] as? String
return cell
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
mySong = indexPath.row
performSegue(withIdentifier: "iTunes", sender: self)
【问题讨论】:
【参考方案1】:您可以像使用数组一样使用字典。唯一的区别是通过下标访问字典值并不能保证结果,因此返回值的类型是可选的。
回到您的问题,我推测您希望打开另一个 ViewController,其中包含导航到 URL 的 WebView。此 URL 由导航到此处之前单击的单元格确定。
我查看了 API,因为你没有提到我会假设你希望加载根据响应中的 artistUrl
键给出的网页。
只需将以下代码添加到didSelectRowAt
方法:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
// safely unwrap artistUrl
// init WebViewController
// set url for WebViewController
if let artistUrl = responseArray[indexPath.row]["artistUrl"], let viewController = storyboard?.instantiateViewController(withIdentifier: "WebViewController") as? WebViewController
viewController.url = artistUrl
present(viewController, animated: true, completion: nil)
制作一个 WebViewController,如果你已经有了,只需稍微修改一下代码。
class WebViewController: UIViewController
@IBOutlet weak var webView: UIWebView!
var url: String?
override func viewDidLoad()
super.viewDidLoad()
// safely unwrap url, then convert it to URL
if let url = url, let urlForRequest = URL(string: url)
let request = URLRequest(url: urlForRequest)
webView.loadRequest(request)
最后一件事,对于这个 API,我注意到所有的 URL 都是 HTTPS。有时,如果您使用非 HTTPS,则需要在您的 plist 中将 AllowArbitraryLoads
设置为 YES。
【讨论】:
好的,经过一些修改,这行得通,但是当我访问 webView 时,我嵌入的后退按钮消失了。作为参考,我的后退按钮通过导航控制器嵌入。 如果您通过单独添加导航栏添加了一个,则它可能会消失。尝试删除您的后退按钮和您个人添加的任何其他 UI 元素。看看它现在是否显示默认按钮。以上是关于如何将 Alamofire 生成的数据从 tableview 推送到 webview的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 从字典(或者Alamofire)直接创建Model文件的工具
如何将我的 imageResponseSerializer 从 Alamofire 更新到 3.0 版本?