我对 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/