Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过segue后使用NSDictionary中的数据_Ios_Swift_Nsdictionary - Fatal编程技术网

Ios 通过segue后使用NSDictionary中的数据

Ios 通过segue后使用NSDictionary中的数据,ios,swift,nsdictionary,Ios,Swift,Nsdictionary,我试图从NSDictionary调用数据,但收到一个错误 这是我收到的错误: Cannot subscript a value of type '[NSDictionary]' with an index of type 'String' 我不确定通过segue后从NSDictionary检索密钥的正确方法。我正在使用JSONSerialization将api json设置为字典。问题是当我不使用tableview或collection视图时,如何从NSDictionary检索数据 以下是苹

我试图从NSDictionary调用数据,但收到一个错误

这是我收到的错误:

Cannot subscript a value of type '[NSDictionary]' with an index of type 'String' 
我不确定通过segue后从NSDictionary检索密钥的正确方法。我正在使用JSONSerialization将api json设置为字典。问题是当我不使用tableview或collection视图时,如何从NSDictionary检索数据

以下是苹果文档中显示的示例:

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
            }
        }

    }
}
以下是我的详细视图代码:

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?[“结果”[“标题”]as?NSString

在另一个ViewController上的CollectionView中,其工作方式为:

film=films?[indexPath.row]
title=电影?[“title”]

正在通过以下代码和网络解析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循环解析数组,然后才能访问键值对。并且尝试使用字典或[String:Any]用法,而不是使用NSDictionary。示例如下

var videos: [Dictionary<String,Any>] = [
["key":"val1"],
["key":"val2"],
["key":"val3"]
]

videos.forEach { (dict) in
print(dict["key"] ?? "")
}
var视频:[字典]=[
[“键”:“val1”],
[“键”:“val2”],
[“键”:“val3”]
]
videos.forEach{(dict)in
打印(dict[“键]?”)
}

在您的示例中,您有一系列视频字典。您想访问“播放时的视频”按钮,请单击。要使用现有代码进行访问,可以进行一些更改

假设您必须使用某些列表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可编码数据结构

不要在swift中使用
NSDictionary
。使用合适的swift字典,让事情变得更简单。错误告诉你答案!只需阅读它所说的内容。你没有di字典。您有一个字典数组。所以错误在于您正在使用字符串访问数组对象,在上述类型[NSDictionary]中,您必须使用int访问它,例如
let movieId=videos![0]
。查看您的示例,您试图在单击按钮时访问视频,因此请使用一些标记来播放按钮,并使用该标记来标识视频。示例代码
@iAction func playVideo(uu发件人:UIButton){let video=videos![sender.tag],movieId=video[“key”]let video=AVPlayer(url:“https://www.youtube.com/watch?v=\(电影ID)“)}
好吧。你没有注意。告诉我,你如何访问
数组的
n
th元素?以及如何访问
Dictionary
n
th元素。访问
Dictionary
th元素没有意义,因为它是一个无序的集合。所以首先了解一些相关信息从
数组
字典
访问元素的通用性。暂时忘记JSON。如果sender.tag是通过segue发送的,它会是什么?