通过 segue 传递后使用来自 NSDictionary 的数据
Using data from NSDictionary after being passed through segue
我正在尝试从 NSDictionary 调用数据,但收到错误消息。
这是我收到的错误:
Cannot subscript a value of type '[NSDictionary]' with an index of type 'String'
我不确定在通过 segue 传递 NSDictionary 后从中检索密钥的正确方法。我正在使用 JSON 序列化将 api json 设置为字典。问题是当我不使用表视图或集合视图索引路径时如何从 NSDictionary 检索数据?
这是 Apple 文档中显示的示例:
let value = dictionary["helloString"]
这是我的 prepareForSegue 代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "detailsSegue" {
if let details = segue.destination as? DetailsView {
if let film = sender as? [NSDictionary]? {
details.films = film
}
}
}
}
这是我的 DetailsView 代码:
import UIKit
import AFNetworking
class DetailsView: UIViewController {
let homepage = FilmsViewController()
var films: [NSDictionary]?
var videos: [NSDictionary]?
@IBOutlet var detailsImage: UIImageView!
@IBOutlet var detailsTitle: UILabel!
@IBOutlet var releaseDate: UILabel!
@IBOutlet var overview: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
detailsTitle.text = films?["title"] as? NSString
loadFilms()
}
}
我也试过:
detailsTitle.text = films?["results]["title"] as? NSString
在另一个 ViewController 的 CollectionView 中,它的工作方式为:
film = films?[indexPath.row]
title = film?["title"]
正在通过此代码和 AFNetworking 解析 NSDictionary:
////////Parse Film API//////////////////
func loadFilms() {
let apiKey = "97a0d64910120cbeae9df9cb675ad235"
let url = URL(string: "https://api.themoviedb.org/3/movie/now_playing?api_key=\(apiKey)&language=en-US&page=1")
let request = URLRequest(
url: url! as URL,
cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData,
timeoutInterval: 10 )
let session = URLSession (
configuration: URLSessionConfiguration.default,
delegate: nil,
delegateQueue: OperationQueue.main
)
let task = session.dataTask(with: request, completionHandler: { (dataOrNil, response, error) in
if let data = dataOrNil {
if let resposeDictionary = try! JSONSerialization.jsonObject(with: data, options:[]) as? NSDictionary {
self.films = resposeDictionary["results"] as? [NSDictionary]
print("response: \(resposeDictionary)")
}
}
})
task.resume()
}
//////////End Parse Film API///////////////////
这里是JSON。我正在尝试访问密钥:
{
"id": 335983,
"results": [
{
"id": "5a7c6a35c3a3680f7f01053a",
"iso_639_1": "en",
"iso_3166_1": "US",
"key": "dzxFdtWmjto",
"name": "VENOM - Official Teaser Trailer (HD)",
"site": "YouTube",
"size": 1080,
"type": "Teaser"
},
{
"id": "5a7cd5389251414b22019912",
"iso_639_1": "en",
"iso_3166_1": "US",
"key": "MDR3bfmzV8c",
"name": "VENOM - Teaser Trailer - In Cinemas October 4",
"site": "YouTube",
"size": 1080,
"type": "Teaser"
},
因为视频是一个字典数组。首先你必须用 for 或 foreach 循环解析数组,然后你可以访问键值对。而不是使用 NSDictionary,尝试使用 Dictionary 或 [String:Any] 用法。示例如下
var videos: [Dictionary<String,Any>] = [
["key":"val1"],
["key":"val2"],
["key":"val3"]
]
videos.forEach { (dict) in
print(dict["key"] ?? "")
}
在您的示例中,您有视频字典数组。您想在播放按钮单击时访问视频。要使用现有代码执行此操作,可以进行一些更改。
假设您必须使用某些呈现视频列表的列表 UI 组件。在每个列表项中,您都有播放按钮。您需要为播放按钮提供标签,它可以是该项目列表的索引,如果您使用的是 TableView,则可以使用 indepath.row 作为按钮的标签。
之后,您需要在播放按钮操作中进行以下更改
@IBAction func playVideo(_ sender: UIButton) {
let video = videos![sender.tag]
let movieId = video["key"]
let video = AVPlayer(url: "https://www.youtube.com/watch?v=\(movieId)"
let videoPlayer = AVPlayerViewController()
videoPlayer.player = video
present(videoPlayer, animated: true, completion: {
video.play()
})
}
我也试图在评论中解释同样的事情。
我对此的最终回答是将所有内容从 NSDictionary 转换为 swift 4 Codable 数据结构
我正在尝试从 NSDictionary 调用数据,但收到错误消息。
这是我收到的错误:
Cannot subscript a value of type '[NSDictionary]' with an index of type 'String'
我不确定在通过 segue 传递 NSDictionary 后从中检索密钥的正确方法。我正在使用 JSON 序列化将 api json 设置为字典。问题是当我不使用表视图或集合视图索引路径时如何从 NSDictionary 检索数据?
这是 Apple 文档中显示的示例:
let value = dictionary["helloString"]
这是我的 prepareForSegue 代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "detailsSegue" {
if let details = segue.destination as? DetailsView {
if let film = sender as? [NSDictionary]? {
details.films = film
}
}
}
}
这是我的 DetailsView 代码:
import UIKit
import AFNetworking
class DetailsView: UIViewController {
let homepage = FilmsViewController()
var films: [NSDictionary]?
var videos: [NSDictionary]?
@IBOutlet var detailsImage: UIImageView!
@IBOutlet var detailsTitle: UILabel!
@IBOutlet var releaseDate: UILabel!
@IBOutlet var overview: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
detailsTitle.text = films?["title"] as? NSString
loadFilms()
}
}
我也试过:
detailsTitle.text = films?["results]["title"] as? NSString
在另一个 ViewController 的 CollectionView 中,它的工作方式为:
film = films?[indexPath.row]
title = film?["title"]
正在通过此代码和 AFNetworking 解析 NSDictionary:
////////Parse Film API//////////////////
func loadFilms() {
let apiKey = "97a0d64910120cbeae9df9cb675ad235"
let url = URL(string: "https://api.themoviedb.org/3/movie/now_playing?api_key=\(apiKey)&language=en-US&page=1")
let request = URLRequest(
url: url! as URL,
cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData,
timeoutInterval: 10 )
let session = URLSession (
configuration: URLSessionConfiguration.default,
delegate: nil,
delegateQueue: OperationQueue.main
)
let task = session.dataTask(with: request, completionHandler: { (dataOrNil, response, error) in
if let data = dataOrNil {
if let resposeDictionary = try! JSONSerialization.jsonObject(with: data, options:[]) as? NSDictionary {
self.films = resposeDictionary["results"] as? [NSDictionary]
print("response: \(resposeDictionary)")
}
}
})
task.resume()
}
//////////End Parse Film API///////////////////
这里是JSON。我正在尝试访问密钥:
{
"id": 335983,
"results": [
{
"id": "5a7c6a35c3a3680f7f01053a",
"iso_639_1": "en",
"iso_3166_1": "US",
"key": "dzxFdtWmjto",
"name": "VENOM - Official Teaser Trailer (HD)",
"site": "YouTube",
"size": 1080,
"type": "Teaser"
},
{
"id": "5a7cd5389251414b22019912",
"iso_639_1": "en",
"iso_3166_1": "US",
"key": "MDR3bfmzV8c",
"name": "VENOM - Teaser Trailer - In Cinemas October 4",
"site": "YouTube",
"size": 1080,
"type": "Teaser"
},
因为视频是一个字典数组。首先你必须用 for 或 foreach 循环解析数组,然后你可以访问键值对。而不是使用 NSDictionary,尝试使用 Dictionary 或 [String:Any] 用法。示例如下
var videos: [Dictionary<String,Any>] = [
["key":"val1"],
["key":"val2"],
["key":"val3"]
]
videos.forEach { (dict) in
print(dict["key"] ?? "")
}
在您的示例中,您有视频字典数组。您想在播放按钮单击时访问视频。要使用现有代码执行此操作,可以进行一些更改。
假设您必须使用某些呈现视频列表的列表 UI 组件。在每个列表项中,您都有播放按钮。您需要为播放按钮提供标签,它可以是该项目列表的索引,如果您使用的是 TableView,则可以使用 indepath.row 作为按钮的标签。
之后,您需要在播放按钮操作中进行以下更改
@IBAction func playVideo(_ sender: UIButton) {
let video = videos![sender.tag]
let movieId = video["key"]
let video = AVPlayer(url: "https://www.youtube.com/watch?v=\(movieId)"
let videoPlayer = AVPlayerViewController()
videoPlayer.player = video
present(videoPlayer, animated: true, completion: {
video.play()
})
}
我也试图在评论中解释同样的事情。
我对此的最终回答是将所有内容从 NSDictionary 转换为 swift 4 Codable 数据结构