UITableViewCell дублирует значения - PullRequest
0 голосов
/ 21 января 2019

Я использую Firebase и внешний API для извлечения данных для UITableView.Как правило, у меня есть этот код.

public static func getUserLayers(completion: @escaping ()->Void){
    Firestore.firestore().collection("layers").whereField("uid", isEqualTo: (Auth.auth().currentUser?.uid)!).addSnapshotListener { (snapshot, error) in
        if error == nil {
            self.layers.removeAll()
            if let snap = snapshot?.documents {
                for doc in snap {
                    let data = doc.data()
                    let provider = data["layerprovider"] as! Int
                    if(provider != 0){
                        Alamofire.request("\(self.providerBaseUrl)\(String(describing: provider))").responseString { (response) in
                            if let resp = response.value {
                                let json = JSON(parseJSON: resp)
                                let logo = json["logo"]["medium"]["url"]
                                let blue = json["bg"]["blue"].intValue
                                let green = json["bg"]["green"].intValue
                                let red = json["bg"]["red"].intValue
                                self.layers.append(
                                    LayerInfo(ean: data["ean"] as! String, name: String(describing: data["name"]), logo: Provider.getLogo(imageUrl: "\(logo)"), bgR: red, bgG: green, bgB: blue, provider: json)
                                )
                            }
                            completion()
                        }

                    }else{
                        self.layers.append(
                            LayerInfo(ean: data["ean"] as! String, name: String(describing: data["name"]), logo: UIImage(), bgR: 0, bgG: 0, bgB: 0)
                        )
                    }
                }
                completion()
            }
        }
    }
}

Это код, который выбирает данные из Firebase, а затем пытается получить провайдера, если он не равен '0'.

ViewController здесь:

LayerService.getUserLayers {
            self.layers = LayerService.layers
            self.tableView.reloadData()
        }

И UITableViewCell:

DispatchQueue.main.async {
        for subview in self.subviews{
            subview.removeFromSuperview()
        }

        let layer = Layer(frame: CGRect(x: 10, y: 5, width: self.bounds.width - 40, height: 210), bg: self.bg, logo: self.logo, ean: self.ean)
        self.addSubview(layer)
    }

Но проблема в том, что при повторном использовании ячеек дублируются 1-я и 5-я ячейки, 2-я и 6-я ячейки и т. Д. И даже когда я нажимаюЯчейка № 1 переворачивает слой в ячейку № 5 (поскольку я переворачиваю ее на подклассе Layer UIView) ...

Где я могу ошибаться?

Спасибо.Любые предложения приветствуются.

Мой cellForRowAt метод

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! LayersTableViewCell 
    cell.logo = self.layers[indexPath.row].logo 
    cell.bg = self.layers[indexPath.row].bg 
    cell.ean = self.layers[indexPath.row].ean 
    return cell 
}

1 Ответ

0 голосов
/ 21 января 2019

Пожалуйста, перезагрузите ваш табличный вид после анализа данных

public static func getUserLayers(completion: @escaping (AnyObject)->Void){
Firestore.firestore().collection("layers").whereField("uid", isEqualTo: (Auth.auth().currentUser?.uid)!).addSnapshotListener { (snapshot, error) in
        if error == nil {
            self.layers.removeAll()
            if let snap = snapshot?.documents {
                for doc in snap {
                    let data = doc.data()
                    let provider = data["layerprovider"] as! Int
                    if(provider != 0){
                        Alamofire.request("\(self.providerBaseUrl)\(String(describing: provider))").responseString { (response) in
                            if let resp = response.value {
                                let json = JSON(parseJSON: resp)
                                let logo = json["logo"]["medium"]["url"]
                                let blue = json["bg"]["blue"].intValue
                                let green = json["bg"]["green"].intValue
                                let red = json["bg"]["red"].intValue
                                self.layers.append(
                                    LayerInfo(ean: data["ean"] as! String, name: String(describing: data["name"]), logo: Provider.getLogo(imageUrl: "\(logo)"), bgR: red, bgG: green, bgB: blue, provider: json)
                                )
                            }
                            completion(["res": self.layers, "stats":1] as AnyObject?)
                        }

                    }else{
                        self.layers.append(
                            LayerInfo(ean: data["ean"] as! String, name: String(describing: data["name"]), logo: UIImage(), bgR: 0, bgG: 0, bgB: 0)
                        )
                    }
                }
                completion(["res": self.layers, "stats":1] as AnyObject?)
            }
        }
    }

}

Затем измените:

LayerService.getUserLayers (withCompletionHandler:AnyObject?) in{
        let dictResponse = withCompletionHandler as! Dictionary<String, Any>
            let isSuccess : Int = dictResponse["stats"] as! Int

            if isSuccess == 1{
              self.layers = LayerService.layers
              DispatchQueue.main.async {
                self.tableView.reloadData()
              }
            }

    }

Это может помочь вам. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...