Отображение элементов массива из JSON в виде таблицы - PullRequest
1 голос
/ 14 июля 2020

Я создаю запрос к API CocktailDB и получаю категории коктейлей из вывода JSON, затем добавляю все категории коктейлей в массив.

Я хочу отображать элементы из массива в моем табличном представлении. Но tableview пуст, а categoryArray.count возвращает 0.

Мой код:

class ViewController: UIViewController {
    
    struct Categories {
        let categoryName: String
    }
    
    @IBOutlet weak var tableView: UITableView!
    var categoriesArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getCategories()
    }
    
    func getCategories() {
        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list")!
        
        let session = URLSession.shared
        
        let task = session.dataTask(with: url) { (data, response, error) in
            do {
                let jsonData = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any]
                let output = self.jsonParserCategories(jsonData!)
                
                self.categoriesArray.append(contentsOf: output)
                print(self.categoriesArray) // print out an array of categories

            } catch {
                print(error)
                return
            }
        }
        task.resume()
    }
    
    private func jsonParserCategories(_ data: [String: Any]) -> [String] {
        var categArray: [String] = []
        
        let allDrinks = data["drinks"] as! [Any]
        
        allDrinks.forEach {
            categArray.append(($0 as! [String: Any])["strCategory"] as! String)
        }
        
        return categArray
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell(style: .default, reuseIdentifier: "cell")
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return categoriesArray.count // return 0 
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return categoriesArray[section]
    }
}

JSON структура: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Вы должны позвонить на reloadData после того, как данные будут установлены. Также установите пустой массив в начале метода getCategories.

func getCategories() {
    categoriesArray = [] // set array to empty
    //...
    self.categoriesArray.append(contentsOf: output)
    DispatchQueue.main.async {
        self.tableView.reloadData() // call reload once `categoriesArray` is set
    }

Надстройка: используйте модель Codable для декодирования JSON вместо JSONSerialization.

0 голосов
/ 14 июля 2020

Перезагрузите данные таблицы, как только получите ответ

func getCategories() {
        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/list.php?c=list")!
        
        let session = URLSession.shared
        
        let task = session.dataTask(with: url) { (data, response, error) in
            do {
                let jsonData = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any]
                let output = self.jsonParserCategories(jsonData!)
                
                self.categoriesArray.append(contentsOf: output)
                print(self.categoriesArray) // print out an array of categories
                DispatchQueue.main.async {
                    tableView.reloadData()
                  }

            } catch {
                print(error)
                return
            }
        }
        task.resume()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...