как отобразить мои данные в моем tableView с запросом Alamofire - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица JSON с этими данными, и я хотел бы получить заголовок + oreview и затем отобразить их в своем приложении, но я заблокирован после этого условия, и я не знаю, как поступить, идеи ?.Я использую Alamofire для своего запроса.

моя вкладка json:

{"results":
[{"title":"The Predator",
  "poster_path":"\/wMq9kQXTeQCHUZOG4fAe5cAxyUA.jpg"
  "overview":"From the outer reaches of space to the small-town streets of suburbia, the hunt comes home. Now, the universe’s most lethal hunters are stronger, smarter and deadlier than ever before, having genetically upgraded themselves with DNA from other species. When a young boy accidentally triggers their return to Earth, only a ragtag crew of ex-soldiers and a disgruntled science teacher can prevent the end of the human race.",
  "release_date":"2018-09-13"}

мой класс Movie.swift:

   import UIKit

class Movie {
    var title: String
    var oreview: String

    public init(title: String, oreview: String) {
        self.title = title
        self.oreview = oreview
    }

    public init?(json: [String: Any]) {
        guard
            let title = json["title"] as? String,
            let oreview = json["oreview"] as? String else {
                return nil

        }

        self.title = title
        self.oreview = oreview
    }
}

My MovieTableVieWCell.swift:

import UIKit
import Alamofire

class MovieTableViewCell: UITableViewCell {

    @IBOutlet var posterView: UIImageView!
    @IBOutlet var title: UILabel!
    @IBOutlet var oreview: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func DescriptionButton(_ sender: UIButton) {
    }

}

extension MovieTableViewCell {
    func draw(movie: Movie) {
        self.title.text = "\(movie.title)"
        self.oreview.text = "\(movie.oreview)"
    }
}

Мой MovieViewController.swift:

import UIKit
import Alamofire
import SwiftyJSON

class MovieViewController: UIViewController {

    @IBOutlet var tableMovie: UITableView!

    var movie: [Movie]?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableMovie.register(UINib(nibName: "MovieTableViewCell", bundle: nil), forCellReuseIdentifier: "Movie")

        self.tableMovie.delegate = self
        self.tableMovie.dataSource = self
        // Do any additional setup after loading the view.
        self.request()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    public func request() {
        let token = Token()
        Alamofire.request("https://api.themoviedb.org/3/movie/upcoming?api_key=\(token.getToken())").responseJSON { response in
            guard
                let json = response.result.value as? [String: Any]
                else {
                    return
            }

            print(json)
             self.tableMovie.reloadData()
        }
    }
}

extension Movie: CustomStringConvertible {
    var description: String {
        let fields = [
            "title: \(self.title)",
            "oreview: \(self.oreview)",
            ]
        return fields.joined(separator: ",")
    }
}

extension MovieViewController: UITableViewDelegate {
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.movie?.count ?? 0
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Movie", for: indexPath) as! MovieTableViewCell
        if let mov = self.movie?[indexPath.row] {
            cell.draw(movie: mov)
        }
        return cell
    }
}

extension MovieViewController: UITableViewDataSource {

}

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы не установили никакого значения в movie .

Сначала необходимо проанализировать ответ и извлечь результаты , представляющие собой массив объектов

guard let json = response.result.value as? [String: Any], let results = json["results"] as? [[String: Any]] else {
    return
}

Во-вторых, вам нужно преобразовать массив объектов в массив Movie и установить его

self.movie = results.map { Movie(json: $0) }

В-третьих, перезагрузить TableView

self.tableMovie.reloadData()
0 голосов
/ 20 сентября 2018

Во-первых, опубликуйте свой json как код:

{"results":[
            {
             "title":"The Predator",
             "poster_path":"/wMq9kQXTeQCHUZOG4fAe5cAxyUA.jpg",
             "overview":"From the outer reaches of space to the small-town streets of suburbia, the hunt comes home. Now, the universe’s most lethal hunters are stronger, smarter and deadlier than ever before, having genetically upgraded themselves with DNA from other species. When a young boy accidentally triggers their return to Earth, only a ragtag crew of ex-soldiers and a disgruntled science teacher can prevent the end of the human race.",
             "release_date":"2018-09-13"
            }
           ]
}

Во-вторых, ваш json поврежден.У вас нет запятой между ".... jpg" и "обзор".У вас нет квадратных скобок и фигурных скобок.Откуда вы взяли этот json?

В-третьих, вы неправильно анализируете свой json, более того, вы ожидаете, что ключ будет называться "oreview", тогда как в json он называется "overview".

Вот как вы должны это сделать:

Измените класс Movie:

class Movie {
    var title: String
    var overview: String

    public init(title: String, overview: String) {
        self.title = title
        self.overview = overview
    }

    class func buildFrom(json: [String: Any]) -> Movie? {

       let results = json["results"] as! [[String : Any]]
       guard let title = results[0]["title"] as? String, let overview = results[0]["overview"] as? String else { return nil }

       return Movie(title: title, overview: overview)

    }
}

Теперь избавьтесь от всего кода из пользовательской ячейки:

class MovieTableViewCell: UITableViewCell {

    @IBOutlet var posterView: UIImageView!
    @IBOutlet var title: UILabel!
    @IBOutlet var overview: UILabel!

}

Теперь перейдем к вашему viewController:

class MovieViewController: UIViewController {

    @IBOutlet var tableMovie: UITableView!

    var movie: Movie?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableMovie.register(UINib(nibName: "MovieTableViewCell", bundle: nil), forCellReuseIdentifier: "Movie")

        self.tableMovie.delegate = self
        self.tableMovie.dataSource = self
        // Do any additional setup after loading the view.
        self.request()
    }

    func request() {
        let token = Token()
        Alamofire.request("https://api.themoviedb.org/3/movie/upcoming?api_key=\(token.getToken())").responseJSON { response in
            guard let json = response.result.value as? [String : Any] else { return }
            self.movie = Movie.buildFrom(json: json)

            self.tableMovie.reloadData()
        }
    }
}

//UITableView Datasource & Delegate methods
extension MovieViewController: UITableViewDelegate, UITableViewDataSource {

   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      if self.movie != nil {
         return 1
      }
      return 0
   }

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "Movie", for: indexPath) as! MovieTableViewCell
      cell.title = self.movie.title
      cell.overview = self.movie.overview

      return cell
   }
}

Это должно сделать это.Если вы вставили свой JSON неправильно, и это на самом деле JSON с более чем 1 фильмом внутри, то в коде потребуются некоторые изменения.Дайте мне знать, и я изменю свой ответ.Кроме того, не забудьте обновить свой JSON в вопросе.Удачи!

0 голосов
/ 20 сентября 2018

Например, сохранить данные фильма в массиве, чтобы источник данных возвращал 1 секцию с элементами array.count.Затем табличное представление автоматически запросит элементы, которые вы передадите из массива.Попросите табличное представление перезагрузить данные, когда вы получите результаты по вашему запросу.

...