我正在使用 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 处的图层(因为我在 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
}
最佳答案
解析数据后请重新加载表格 View
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()
}
}
}
也许对你有帮助。谢谢。
关于ios - UITableViewCell 重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54287982/