APP的一个页面用到了自定义的UITableViewCell,由于iOS框架的cell重用机制,遇到了一个BUG,总结一下
现象
自定义的UITableViewCell里有一个UIButton,点击这个button以后,需要改变cell的样式,包括换UILabel字体颜色,禁用该UIButton等。结果发现,点击按钮之后,不仅当前cell的字体颜色变了,还有另外几个cell的字体颜色也跟着变,而且是随机的
原因
后来想到,应该是由于iOS的cell重用机制造成的,原来的代码类似:
-(void) onButtonPressed
{
label.textColor = [UIColor grayColor];
button.enabled = NO;
}
其中label和button都是这个cell的实例变量,由于cell是自动重用的,所以其他重用此cell的格子也会跟着一起变
正确的做法
修改之后,正确的做法应该是:
1、在controller中找到此cell对应的模型
2、修改模型对应的值
3、调用tableView的reloadData方法
4、在dataSource的代理方法里,再调用cell上的设置样式的方法
示意代码:
-(void) voteButtonPressed
{
[myController voteWithCell:self];
}
-(void) voteWithCell:(CandidateTableViewCell*)cell
{
RankingView *myView = (RankingView*)self.view;
// 找到对应的模型
NSIndexPath *indexPath = [myView.tableView indexPathForCell:cell];
Candidate *candidate = [candidates objectAtIndex:indexPath.row];
// 设置新值
candidate.voteCount++;
candidate.isVoted = YES;
// 触发数据加载
[myView.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CandidateTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[CandidateTableViewCell reuseIdentifier] forIndexPath:indexPath];
Candidate *candidate = [candidates objectAtIndex:indexPath.row];
[cell setCandidate:candidate isExpired:self.stage != 1 controller:self];
return cell;
}
分享到:
相关推荐
1. **UITableViewCell和UICollectionViewCell**:这两种类型的Cell分别用于UITableView和UICollectionView,它们是显示数据的基础组件。自定义Cell意味着我们需要扩展这些类,添加额外的UI元素和功能。 2. ** nib/...
为了解决这个问题,UITableView和UICollectionView采用了Cell重用机制,也就是著名的"Cell复用池"。 - **Cell复用池原理**:当一个cell滑出屏幕时,系统会将其回收到复用池中,而不是立即释放。当需要新cell时,...
在iOS开发中,"cellFactory"通常指的是一个用于创建UITableView或UICollectionViewCell的工厂模式设计模式。这个设计模式的目的是为了简化代码,提高可维护性和复用性,使得UI组件的创建更加灵活。以下是对...
2. 自定义Cell类:为了实现自定义的cell样式,通常需要创建一个继承自UITableViewCell或UICollectionViewCell的新类。在这个新类中,你可以添加所需的UI元素(如UILabel、UIImageView等)并进行布局设置。 3. XIB与...
- 为了提高性能,UITableView和UICollectionView都采用了Cell重用机制。当一个cell滑出屏幕时,会被回收并标记为待用,当需要新cell时,会复用这些待用cell,而不是每次都创建新的cell。 - 这可能导致一个问题:...
自定义UICollectionViewCell允许开发者创建具有特定布局和内容的单元格,例如显示商品图片、标题等。`.h`文件包含接口定义,`.m`文件实现具体的逻辑。 2. `HomeClassifyCollectionViewCell.h` 和 `.m`: 类似于`...
- UICollectionViewCell类似,是UICollectionView的基础单元,每个cell可以是一个独立的视图,可以根据需要自定义布局和内容。 3. **DataSource与Delegate**: - 数据源(DataSource)协议规定了应用必须实现哪些...
1. **Cell模板**:开发者可以创建自定义的UITableViewCell或UICollectionViewCell子类,定义Cell的外观和布局。这包括设置背景色、边框、图像、文字样式等。 2. **UI元素**:在Cell中添加各种UI元素,如UIImageView...
但是,由于UITableView的Cell重用机制非常高效,该项目的目标可能是复用这一机制,以优化性能和减少内存开销。 首先,我们需要了解UITableView的工作原理。UITableView通过Cell重用来提高性能,当一个Cell滑出屏幕...
UICollectionView由两部分组成:UICollectionView实例(用于管理视图)和UICollectionViewCell(用于显示单个数据项)。此外,UICollectionViewFlowLayout是默认的布局类,用于控制cell的大小和位置。 要创建一个...
- 在实现cell展开功能时,开发者通常需要自定义UITableViewCell或UICollectionViewCell,添加额外的视图元素来存放展开后的内容。 3. **数据模型**: - 数据模型是驱动UI变化的核心,需要包含一个标识是否展开的...
最后,为了提高性能,我们需要重用UICollectionViewCell。类似UITableView的`dequeueReusableCellWithIdentifier:`方法,UICollectionView也有同样的机制。确保在`viewDidLoad`中注册cell的类: ```objc ...
这个主题主要涉及UITableView和UICollectionView的自定义Cell,以及如何根据数据内容动态调整Cell的高度和布局。以下是对这一主题的详细说明: 1. **UITableView与UICollectionView**: - UITableView:是iOS中...
Swift中的FMPageViewController是一个高效的UI控件,专为实现横向翻页效果而设计,它引入了页面重用机制,类似于UITableView或UICollectionView中的Cell重用,从而优化性能并减少内存消耗。在iOS应用开发中,这样的...
它允许开发者自定义单元格(UICollectionViewCell)的布局和交互,提供了一种灵活的方式来展示大量数据。 ### UICollectionView的创建 首先,我们需要在Storyboard或代码中创建UICollectionView实例。在Storyboard...
与`UITableView`类似,`UICollectionView`也使用`UICollectionViewCell`来表示每个单独的项目。每个cell都可以根据需求自定义其布局和外观,使得在显示复杂数据时具有高度的灵活性。 在创建`UICollectionView`时,...
- 对于嵌套的UICollectionView,要特别注意cell的重用机制,避免内存泄漏和性能问题。 - 在处理滑动变色时,确保颜色过渡平滑,避免突兀的转变。 - 在状态栏风格切换时,需要考虑到不同颜色模式下的表现,如浅色模式...
在处理大量数据时,为了优化性能并减少内存消耗,开发者通常会使用可复用机制,就像UITableView和UICollectionView中的Cell重用一样。本项目"ios-拥有可复用机制的MCReusableScrollView.zip"正是基于这样的设计理念...
3. 自定义UITableViewCell和UICollectionViewCell,包括重用标识符的设置和cell内容的填充。 4. UICollectionViewFlowLayout的使用,定制单元格的布局。 5. 动态加载和懒加载数据,提高性能。 6. 点击事件处理,如`...