如何将 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文件的工具

从 MySQL 数据库表生成 SQL 脚本

如何将我的 imageResponseSerializer 从 Alamofire 更新到 3.0 版本?

如何使用 Alamofire 从缓存和网络加载数据?

Swift 2 - 如何从 Alamofire.responseJSON 获取数据

UICollectionView 中的 Alamofire + Swift