TableViewController 具有重复的列表项

问题描述 投票:0回答:2

我正在使用 swift 4.2 构建 iOS 应用程序,并且我有一个具有奇怪行为的 TableViewController。

这是代码:

import UIKit

class StoreByCategoryViewController: UITableViewController{
    
    @IBOutlet var storeTableView: UITableView!
    
    var categorySelected:CategoryModel?
    var listaStore = [StoreModel]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = "Elenco Partner"
        
        if((categorySelected) != nil && categorySelected?.id != "0"){
            //posso chiamare il WS estraendo tutti i negozi
            //per categoria
            getStoreByCategory(category : self.categorySelected!);
            storeTableView.reloadData()
        }else{
            getStore();
        }
        storeTableView.delegate = self
        storeTableView.dataSource = self
        
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return listaStore.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return listaStore.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = storeTableView.dequeueReusableCell(withIdentifier:"customCell") as! StoreTableViewCell
        let storeModel = listaStore[indexPath.row]
        cell.storeAddress.text = storeModel.address
        cell.storePhone.text = storeModel.phoneNumber
        cell.storeDescription.text = storeModel.description
        if(storeModel.imageUrl != ""){
            print(storeModel.imageUrl)
            let imageUrl:NSURL = NSURL(string: storeModel.imageUrl!)!
            print(storeModel.imageUrl)
            DispatchQueue.global(qos: .userInitiated).async {
                let imageData:NSData = NSData(contentsOf: imageUrl as URL)!
                DispatchQueue.main.async {
                    let image = UIImage(data: imageData as Data)
                    cell.storeImage.image = image
                    cell.storeImage.contentMode = .scaleToFill
                }
            }
        }
       // cell.storeImage.layer.cornerRadius = cell.storeImage.frame.height / 2
        return cell
    }
    
    
    
    
    
    
    
    func getStoreByCategory(category : CategoryModel){
        var params = [
            "cat_id" : category.id
        ]
        let postUrl = APIRequest(endPoint: "get_store_by_category")
        postUrl.sendRequest(parameters: params as! [String : String]) {
            responseObject, error in
            guard let responseObject = responseObject, error == nil else {
                print(error ?? "Unknown error")
                return
            }
            do{
                let messageData = try JSONDecoder().decode(ResponseStoreByCategoryModel.self, from: responseObject)
                var array = messageData.result
                for store in array {
                    var imageUrl = ""
                    if(store.image.count > 0){
                        imageUrl = store.image[0].image
                    }
                    let s = StoreModel(id: "",
                                           description: store.firstName,
                                           imageUrl: imageUrl,
                                           address: store.address,
                                           phoneNumber: store.phone)
                    self.listaStore.append(s)
                }
                 self.storeTableView.reloadData()
            }catch{
                print("errore durante la decodifica dei dati")
            }
        }
    }
    
    func getStore(){
        var params = [
            "" : ""
        ]
        let postUrl = APIRequest(endPoint: "get_store")
        postUrl.sendRequest(parameters: params as! [String : String]) {
            responseObject, error in
            let user = CategoryModel(id: "0",
            description: "Tutti",
            imageUrl: "")
            //self.listaCategorie.append(user)
            guard let responseObject = responseObject, error == nil else {
                print(error ?? "Unknown error")
                return
            }
            do{
                let messageData = try JSONDecoder().decode(ResponseStoreModel.self, from: responseObject)
                var array = messageData.result
                for store in array {
                    var imageUrl = ""
                    if(store.image.count > 0){
                        imageUrl = store.image[0].image
                    }
                    let s = StoreModel(id: "",
                                           description: store.firstName,
                                           imageUrl: imageUrl,
                                           address: store.address,
                                           phoneNumber: store.phone)
                    self.listaStore.append(s)
                }
                self.storeTableView.reloadData()
            }catch{
                print("errore durante la decodifica dei dati")
            }
        }
    }
}

方法 getStore、getStoreByCategory,返回 9 项,但是该方法

numberOfSection 和填充 customCell 的方法被调用 3 次。所以我有一个包含 27 个项目而不是 9 个项目的表。

ios tableview swift4.2
2个回答
0
投票

看起来您只需要 1 个包含 9 行的部分。如果是这种情况,您可以从

numberOfSections
实现返回 1。

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

我注意到的另一件事是 - 你还有一个

UITableViewController
和一个
@IBOutlet var storeTableView: UITableView!
。您不需要插座,您可以使用
self.tableView
来实现同样的目的。


0
投票

您似乎在 StoreByCategoryViewController 中遇到了意外行为,其中 numberOfSections(in:) 和 tableView(_:cellForRowAt:) 方法被多次调用,导致出现 27 个单元格,而不是预期的 9 个单元格。发生这种情况的原因是由于各种原因,确保表视图数据源方法的正确实现至关重要。以下是一些可能的原因和解决方案:

  1. 多次调用:numberOfSections(in:) 和 tableView(_:cellForRowAt:) 方法应该只返回数量 与您的数据相对应的部分和行。仔细检查一下 您的数据源 (listaStore) 包含预期的 9 项。如果它 含有更多,它会导致额外的细胞 显示。
  2. 调用storeTableView.reloadData():您正在调用 storeTableView.reloadData() 多次,均在 viewDidLoad() 中 并在您的网络请求完成关闭之内。确保 这些调用是必要的并且不会导致过度重新加载 您的表格视图。
  3. 故事板设置:检查您的故事板或 视图控制器的 XIB 文件有任何额外的原型单元或 定义的部分。在故事板中有额外的原型单元 可能会导致显示额外的单元格。
  4. 自动布局问题: 确保故事板或 XIB 文件中的单元格布局是 正确配置,并正确设置约束。汽车 布局问题有时会导致意外行为。
  5. 查看层次结构:验证没有嵌套或重叠的表 故事板或视图层次结构中的视图或表视图单元格。这 可能会导致意外的细胞复制。
  6. 委托和数据源 连接:仔细检查表视图的委托和数据 故事板中的源连接已正确链接到您的 视图控制器。
  7. 断点和调试:可以设置断点 在您的表视图数据源方法中查看何时以及有多少 他们被召唤的次数。这可以帮助查明来源 问题。
  8. 数据源管理:确保您不 无意中将重复数据附加到您的 listaStore 数组中, 这可能会产生额外的细胞。

通过仔细检查这些方面,您应该能够识别并解决导致表格视图显示的单元格数量超出预期的问题。

© www.soinside.com 2019 - 2024. All rights reserved.