Использование данных из NSDictionary после прохождения через segue - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь вызвать данные из NSDictionary, но получаю ошибку.

Это ошибка, которую я получаю:

Cannot subscript a value of type '[NSDictionary]' with an index of type 'String' 

Я не уверен в правильном способе получения ключа из NSDictionary после прохождения его через segue.Я использую JSONSerialization, чтобы установить API JSON для словаря.Вопрос в том, когда я не использую путь таблицы или представление коллекции в indexpath, как мне получить данные из 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

В CollectionView на другом ViewController он работал как:

film = films?[indexPath.row] title = film?["title"]

NSDictionary анализируется с помощью этого кода и AFNetworking:

////////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"
},

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

В вашем примере у вас есть массив видео словаря.Вы хотите получить доступ к видео при нажатии кнопки воспроизведения.Сделать это с вашим существующим кодом можно с некоторыми изменениями.

Предположения, вы должны использовать какой-то компонент пользовательского интерфейса списка, который отображает список видео.в каждом элементе списка есть кнопка воспроизведения.вам нужно присвоить тэгу кнопку воспроизведения, это может быть индекс списка для этого элемента, если вы используете 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()
    })
}

Я пытался объяснить то же самое в комментарии.

0 голосов
/ 09 октября 2018

Мой последний ответ на этот вопрос - преобразовать все из NSDictionary в структуру данных Swift 4 Codable

0 голосов
/ 06 октября 2018

Потому что видео это массив словарей.Сначала вы должны проанализировать массив с циклом for или foreach, затем вы можете получить доступ к паре ключ-значение.И вместо использования NSDictionary, попробуйте использовать словарь или [String: Any] использование.Пример ниже

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

videos.forEach { (dict) in
print(dict["key"] ?? "")
}
...