swift - 如何将Alamofire生成的数据从tableview推送到webview

标签 swift xcode webview tableview alamofire

我对 Swift 语言有点陌生。因此,我需要一些关于如何将 Alamofire 生成的在线数据从一个 View Controller 中的 TableView 推送到位于不同 View Controller 中的 Web View 的建议。更具体地说,在 JSON 数据中,有多种带有标签“url”的元素。我的目标是将这些 url 元素与适当的 tableview 单元格相匹配,这样当单击该单元格时,它会将用户带到新 View Controller 中的 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)
    }
}

最佳答案

您可以像使用数组一样使用字典。唯一的区别是通过下标访问字典值并不能保证结果,因此返回值的类型是可选的。

回到你的问题,我猜你希望打开另一个 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。

关于swift - 如何将Alamofire生成的数据从tableview推送到webview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46964736/

相关文章:

ios - Xcode 6.0.1 - iOS 模拟器黑屏

iphone - 当我的同事更改代码并将其提交到存储库时,我可以看到代码,但 xCode 编译时就好像他的贡献不存在一样

java - InputMethodManager 在 webview 中显示小键盘

swift - collisionBitMask 值在 SpriteKit 中不起作用

ios - 核心数据:获取属性的最小值

android - Android : using WebView with external links 中的 fragment

android - CSS 不适用于 WebView.loadDataWithBaseURL

xcode - 快速包装和展开

Swift - stopAnimating() - 只能在主线程中使用

ios - Swift - 在 Collection View 的其余部分后面发送标题 View