UITableView 单元格重复

UITableView Cell repeating

我创建了一个带有显示数据的自定义单元格的表格视图。显示器工作正常。但是单元格是重复的,所以显示的单元格比数组中的项目更多。

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int {    
    // when searchcontroller is active, return the number of search results. If inactive simply return the count of the full AED list.
        return self.AEDItems.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.AEDItems.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier = "Cell"
        let cell:CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomTableViewCell

        // Check if controller is active. If user is doing a search retrieve the aeds from the search result rather than the AED array.
        let aed = self.AEDItems[indexPath.row]
        cell.addressLabel?.text = aed.owner
        cell.objectLabel?.text = aed.street

        return cell
    }

为什么会这样?我想这与电池重用有关。但是物品的数量不解决吗?

问题是这个方法:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {    
// when searchcontroller is active, return the number of search results. If inactive simply return the count of the full AED list.
    return self.AEDItems.count
}

此方法要求的是节数。你应该return简单地从这个方法1

相反,您在 AEDItems 数组中拥有与对象一样多的部分。然后在您的其他方法中,您没有放置任何特定于部分的逻辑。所以每个部分都是相同的。但实际上我们只想要一个有很多行的部分。

所以,我们实际上只想:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {    
// when searchcontroller is active, return the number of search results. If inactive simply return the count of the full AED list.
    return 1
}

或者,正如 @johnpatrickmorgan 在评论中阐明的那样,我们可以完全省略这个可选的协议方法,因为 UITableView 假定只有一个部分,如果 datasource省略了这个方法。

如需更多阅读,请查看 UITableView Data Source protocol documentation regarding numberOfSectionsInTableView:

您只需要部分。如果它是一个,那么只做一个。如果您有多个部分和每个部分的数据,则对每个部分使用该数据

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {    
// when searchcontroller is active, return the number of search results. If inactive simply return the count of the full AED list.
    return 1 
    //return self.AEDItems.count
}

要体验 Section,请使用 UITableView 的以下方法

func tableView( tableView : UITableView,  titleForHeaderInSection section: Int)->String {

return "Section"
}

func tableView (tableView:UITableView , heightForHeaderInSection section:Int)->Float 
{
    return 20.0
}

我建议您查看本教程Customizing Header and Footer of Table View in iOS8 with Swift

您正在 return 计算数组的节数,这就是发生这种情况的原因,所以请 return 1 个节

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {    
    // when searchcontroller is active, return the number of search results. If inactive simply return the count of the full AED list.
        return 1
    }