禁用所选单元格的prepareForReuse
我有一个自定义的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
(或只是方法中的代码),以及如何?
将表格单元想象为被重用以容纳不同事物(标签,图像,button等)的哑容器。
您填充cellForRowAtIndexPath中的单元格。
您在prepareForReuse中清空它们,以便它们可以被重新填充并重用。
不要混淆这两个行为。
当你填充单元格时,你应该从你存储在其他地方的数据填充它 – 也就是不能从其他单元格填充。 如果您在填充单元格时依靠indexPathsOfSelectedCells来帮助您,则会遇到问题。 不要这样做。
通常你会有一个对象数组,每个对象对应一个单元格。 您的表格中有与数组中的对象一样多的单元格。 您可以在viewDidLoad中初始化数组中的对象,或者从前一个视图控制器传入它们。
这个过程不一定要复杂。 大多数单元格只显示几位数据,所以你的对象(通常称为模型)不需要有很多属性来保存这些数据。
当用户select一个单元格时,在其对应的对象中设置一个“selected”属性来表示这个。 即使单元格从屏幕滚动并重新使用,该值仍然保留在对象中。 那很好。
现在,当用户滚动回到单元格时,可以用来自相应对象的数据填充单元格。 由于该对象具有“选定”属性集,所以在这种情况下,通过添加所需的标签来“填充”单元格。 或者如果没有设置,则不要添加标签。
在prepareForReuse中,始终删除标签以使单元处于空状态,随时可以重新填充。
滚动的单元格将被重用,并且无法绕过它。 即使您避免使用removeFromSuperview逻辑,该单元格也会重新出现在不同的索引path,可能不在您想要的位置。
有条件地configuration单元格的方法是在cellForRowAtIndexPath中。 在那里,您可以询问indexPath是否在表视图的indexPathsOfSelectedCells之间。 如果是,则使用额外的标签进行configuration,否则configuration。
减less混乱的一种方法是让这些标签无条件地留在单元中,只要将它们的alpha设置为0或1,这取决于select状态。
例如,在
- (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;
更重要的是,这是build议的地方,可以根据模型及其在表格中的当前位置可靠地configuration单元格