Я делаю вызов API, который, похоже, обрабатывает и собирает данные (использованные точки печати и останова), но, похоже, все еще не могу понять, что мои данные не отображаются в моей пользовательской ячейке. Кто-нибудь может взглянуть и помочь мне?

Вот мой контроллер TableView:

    var fightersArray: [UFCFighter]?

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchFighter { (_) in
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fightersArray?.count ?? 0
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "fighterCell", for: indexPath) as? UFCFighterTableViewCell else { return UITableViewCell() }

        cell.fighter = fightersArray?[indexPath.row]

        return cell
    }

    func fetchFighter(completion: @escaping ([UFCFighter]?) -> Void) {
        guard let url = URL(string: "http://ufc-data-api.ufc.com/api/v1/us/fighters") else { return }
        let task = URLSession.shared.dataTask(with: url, completionHandler: {
            (data, response, error) -> Void in

            if error != nil {
                print(error!.localizedDescription)
                completion(nil)
            } else {

                do {

                    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)

                    for dictionary in json as! [[String: Any]] {

                        let fighters = UFCFighter()
                        fighters.firstName = dictionary["first_name"] as? String
                        fighters.lastName = dictionary["last_name"] as? String
                        fighters.weightClass = dictionary["weight_class"] as? String
                        fighters.wins = dictionary["wins"] as? Int
                        fighters.losses = dictionary["losses"] as? Int
                        fighters.imageURL = dictionary["thumbnail"] as? String
                        self.fightersArray?.append(fighters)
                        completion(self.fightersArray)
                        self.tableView.reloadData()

                        print(fighters)
                    }

                } catch {

                    print("error in JSONSerialization")
                }
            }
        })
        task.resume()
    }
}

Вот моя кастомная ячейка:

    var fighter: UFCFighter? {
        didSet {
            self.nameLabel.text = self.fighter?.fullName
            self.weightClassLabel.text = self.fighter?.weightClass
            self.recordLabel.text = "Wins: \(String(describing: self.fighter?.wins)) - Losses: \(String(describing: self.fighter?.losses))"
            self.setupThumbnailImage()
        }
    }

    func setupThumbnailImage() {
        if let thumbnailImageURL = fighter?.imageURL {
            guard let url = URL(string: thumbnailImageURL) else { return }
            let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
                if error != nil {
                    print(error!.localizedDescription)
                }

                DispatchQueue.main.async {
                    self.fighterImage.image = UIImage(data: data!)
                }
            })
            task.resume()
        }
    }

    @IBOutlet weak var fighterImage: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var weightClassLabel: UILabel!
    @IBOutlet weak var recordLabel: UILabel!
}

Надеюсь, это не глупый вопрос, поскольку я пытаюсь улучшить свои навыки работы с API.

0
Luis P. 19 Июл 2017 в 09:06
Вы получили ответ от API? или установить точку останова после добавления данных в "self.fightersArray? .append (fighters)" и проверить добавление или нет?
 – 
Brijesh Shiroya
19 Июл 2017 в 09:10
Вы регистрируете UFCFighterTableViewCell как "fighterCell"? Этого нет в предоставленном коде, и ваш tableView просто вернет простой UITableViewCell
 – 
Tristan Burnside
19 Июл 2017 в 09:13
ПРИВЕТ, моя строка куда-то направлена, и доступ осуществляется без логики, ответьте мне, если у вас есть какие-либо сомнения, cell.nameLabel.text = fightersArray? [IndexPath.row]. имя
 – 
Arun
19 Июл 2017 в 09:44
Да, «fighterCell» было первым, что я проверил, поскольку это уже случалось со мной раньше. @TristanBurnside ... BrijeshShiroya Я думал, что значения добавляются, но они не были b / c, как сказал Бэкон, я не давал fightersArray значение по умолчанию для пустого массива.
 – 
Luis P.
19 Июл 2017 в 21:53

1 ответ

Лучший ответ

Ваш var fightersArray: [UFCFighter]? равен нулю в момент, когда вы его добавляете, вам нужно сначала создать экземпляр массива, прежде чем вы сможете это сделать.

Например, вы можете изменить его на var fightersArray: [UFCFighter] = [], и он будет работать. Установив значение по умолчанию (пустой массив), не логично оставлять его как необязательный, поэтому я удалил ?.

Или не используйте append, а установите fighersArray напрямую с вашими полученными данными: self.fightersArray = fighters

0
Bacon 19 Июл 2017 в 10:16
Это сработало! Не знаю, как я этого не уловил, но спасибо за вашу помощь.
 – 
Luis P.
19 Июл 2017 в 21:58