Индекс массива вне диапазона при заполнении табличного представления из базы данных Firebase - PullRequest
0 голосов
/ 26 февраля 2020
    let ref = Database.database().reference(withPath: "items")
            ref.observe(.value) { (snapshot) in
                guard let dict = snapshot.value as? NSArray else { return }
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                dict.forEach { (value) in
                    do {

                        let itemData = try JSONSerialization.data(withJSONObject: value,options: .prettyPrinted)
                        let item = try decoder.decode(Item.self, from: itemData)
                            self.items.append(item)
                    }
                    catch let err {
                    print(err.localizedDescription)
                    }
                }
print(self.items) // This 
print(self.items[0]) // works 
            }

и пытается получить доступ к элементам в табличном представлении:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
itemType = String(describing: (self.items[indexPath.section].item_type)) // terminating with index out of range error
            //...
    }

Ошибка возникает потому, что методы наблюдения работают асинхронно и выполняются позже, после чего табличное представление заполняет данные.

Как решить эту проблему

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

, если вы хотите использовать numberofsections

func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
  }
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
itemType = String(describing: (self.items[indexPath.section].item_type)) 
    }

, если вы хотите использовать numberofrows

func numberOfSections(in tableView: UITableView) -> Int {
        return 1
  }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
itemType = String(describing: (self.items[indexPath.row].item_type)) 
    }

1 голос
/ 26 февраля 2020

Вам нужно что-то вроде этого :::

let ref = Database.database().reference(withPath: "items")
        ref.observe(.value) { (snapshot) in
            guard let dict = snapshot.value as? NSArray else { return }
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            dict.forEach { (value) in
                do {

                    let itemData = try JSONSerialization.data(withJSONObject: value,options: .prettyPrinted)
                    let item = try decoder.decode(Item.self, from: itemData)
                        self.items.append(item)
                }
                catch let err {
                print(err.localizedDescription)
                }
            }

            self.yourtableView.reloadData()

            print(self.items) // This 
             print(self.items[0]) // works 
        }

И вам нужно реализовать numberOfRows в методе пути индекса

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

и вернуть туда items.count.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     itemType = String(describing: (self.items[indexPath.row].item_type)) // terminating with index out of range error
        //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...