我有一个定制的UITableViewCell。当单元格被选中时,将向其添加一个UILabel。为了避免混乱,我不得不使用prepareForReuse,如下所示:
- (void)prepareForReuse {
NSArray *viewsToRemove = [self.view subviews];
for (UILablel *label in viewsToRemove) {
[label removeFromSuperview];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
return customCell;
}问题是当我向下滚动到标签不在视图时,然后我向上滚动,标签就不在了。原因很明显是因为当单元格被重复使用时,我删除了所有的标签。
那么,是否有一种方法可以禁用所选行的prepareForReuse (或者仅仅是方法中的代码),以及如何禁用?
发布于 2015-02-05 07:42:29
把表格单元格看作是可重用的容器,用来保存不同的东西(标签、图像、按钮等)。
填充cellForRowAtIndexPath中的单元格。
您可以在prepareForReuse中清空它们,以便再次填充并重用它们。
不要混淆这两种行为。
当您填充该单元格时,您应该从存储在其他地方的数据(即不是从其他单元格中)填充它。如果您在填充单元格时依赖indexPathsOfSelectedCells来帮助您,您将遇到问题。不要这样做。
通常,您将有一个对象数组,其中每个对象对应于一个单元格。您的表中的单元格与数组中的对象一样多。您可以在viewDidLoad中初始化数组中的对象,或者从以前的视图控制器中传递它们。
这个过程不一定很复杂。大多数单元格只显示少量的数据,因此您的对象(通常称为模型)不需要有很多属性来保存这些数据。
当用户选择一个单元格时,在其相应的对象中设置一个"selected“属性来指示这一点。即使在单元格从屏幕上滚动并重用时,此值仍保留在对象中。那很好。
现在,当用户回滚回单元格时,您将使用来自相应对象的数据填充该单元格。由于该对象具有其"selected“属性集,因此可以通过在本例中添加所需的标签来”填充“单元格。或者如果没有设置,就不添加标签。
在prepareForReuse中,始终删除标签,将单元格置于空状态,准备重新填充。
发布于 2015-02-05 06:03:43
被滚动的细胞将被重复使用,没有办法绕过它。即使您避免了removeFromSuperview逻辑,该单元格也会出现在不同的索引路径上,可能不是您想要的位置。
有条件地配置单元的方法是在cellForRowAtIndexPath中。在那里,您可以询问indexPath是否在表视图的indexPathsOfSelectedCells中。如果是,那么使用额外的标签来配置它,如果不是,则不配置。
减少混乱的一种方法是让这些标签无条件地留在单元格中,只需根据选择状态将它们的alphas设置为0或1。
例如,在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
// if you know the table has singular selection
NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow];
BOOL rowIsSelected = [indexPath isEqual:selectedIndexPath];
// OR, for multiple select...
NSArray *selection = [tableView indexPathsForSelectedRows];
BOOL rowIsSelected = [selection containsObject:indexPath];
// now either conditionally create/destroy or show/hide the subviews
// that appear on selection (I prefer show/hide for simpler cells)...
[cell configAsSelected:rowIsSelected]; // have the custom cell do it
// in that method, or here, if you're less OO-inclined...
cell.subviewThatAppearsOnSelected.alpha = (rowIsSelected)? 1.0 : 0.0;更重要的是,这是根据模型及其当前在表中的位置可靠地配置单元格的建议位置。
https://stackoverflow.com/questions/28337041
复制相似问题