以下所有问题均基于使用此方法:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomUserTableViewCell", forIndexPath: indexPath) as! CustomUserTableViewCell
cell.user_id = items[indexPath.row]
return cell
}
resetCell()
,它重置实例变量,然后在willDisplayCell
委托中调用它吗?listenToNotifications()
内拨打willDisplayCell
。didEndDisplayingCell()
时,是否应删除所有单元格的通知观察者? willDisplayCell
和didEndDisplayingCell
内,那么我应该在cellForRowAtIndexPath
内放置什么?我编写了所有代码,假设每个单元格都是它自己的实例(我没有理解"重用"单元格的概念),但现在我知道我不能这样想这一点。
答案 0 :(得分:6)
重用是一个在使用table / collectionViews时非常常见的问题。 Table / CollectionViewCells有一个方法调用prepareForReuse
,专门用于指示您的内容。防止重用问题的一种方法是让拥有控制器成为管理数据的控制器。每次调用cellForRowAtIndexPath
时,您都应传入相应的模型对象,然后单元格将对其进行自我配置。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomUserTableViewCell", forIndexPath: indexPath) as! CustomUserTableViewCell
cell.configureWithObject(items[indexPath.row])
return cell
}
class CustomUserTableViewCell: UITableViewCell {
override func prepareForReuse() {
// set appropriate properties to nil that would incorrectly affect future cells
}
func configureWithObject(object: CustomModelObject) {
// configure self with the passed in object
}
}
您可能不希望细胞观察到通知。这可能导致非常混乱的重用问题。最佳路由是让您的控制器类获取通知并在索引路径重新加载特定单元。 (如果你想让我详细说明,我可以)
deinit
内。拨打电话NSNotificationCenter.DefaultCenter().removeObserver(self)
以下是数据流的示例:
查看模型 - 包含网络调用和从数据库中检索对象的逻辑。如果您没有数据库,可以使用它来设置您将用作数据源的任何表示。
查看控制器 - 保留在表视图中,该视图会自动处理已注册的所有单元格的重用。您符合UITableViewDataSource,这使您有机会配置单元格。在cellForRowAtIndexPath
中,您应该处于可以将单元格传递给模型对象的位置。
通常会看到这样的电话:
let object = dataSource.objectForIndexPath(indexPath)
cell.configureWithObject(object)
单元格 - 获取模型对象并使用该数据进行自我配置。基本模型对象将包含名为title的String属性,其值为“My Awesome Title!”。当您的单元格获取对象时,它需要做的只是titleLabel.text = modelObject.title
。可以在单元格内进行一些额外的基本计算,但大多数应该事先处理。这是iOS设计模式的核心原则:MVC,MVVM等。标签通常没有太多的重用问题,特别是如果你组织这样的事情,但另一方面,图像。 prepareForReuse
myImageView.image = nil
通常会拨打{{1}}这样的电话。这将确保它为下次配置单元格做好准备。
答案 1 :(得分:3)
是的,将为您管理实例数。
不,他们不会自动重置。您可以覆盖UITableViewCell子类中的prepareForReuse
,也可以处理cellForRowAtIndexPath
中的所有案例。
假设您希望所有单元格都收听相同的通知,您可以在awakeFromNib
中注册通知,如果您使用过故事板或xib,或者您可以在UITableViewCell子类中注册& #init; s init。否则,您可以cellForRowAtIndexPath
您应该删除deinit
中的观察。如果单元格需要侦听不同的通知,您还应该删除prepareForReuse
中的观察。
willDisplayCell
通常用于静态表视图。您应该在cellForRowAtIndexPath