在iOS 开发中 有很大一部分的页面是用UITableView实现的,学会学好UITableView至关重要,一定要深入理解UITableView应用和重用机制,本篇文章主要介绍UITableView的重用。
先强调几点我平时实现UITableView遵从的原则:
1.在一个页面中相同的cell尽量可重用,不同的cell不要重用(分开写)。
2.一个页面都是相同的cell单元格,控件又比较多尽量新建一个类继承自UITableViewCell,一个页面是用UITableView实现的,但是每一个cell都不相同,可以考虑在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}
方法中直接实现,但是要注意在这种情况下就不要用UITableView的重用机制了(重用机制还是可以实现的,但是每一个indexPath.row 分开写),要注意每一个cell的高度。
在实现UITableView的时候有时候我们用UITableView的重用机制出现视图叠加,这就是UITableView的重用出现问题了,解决的办法有三种:
1.不使用UITableView的重用机制,实现代码如下:
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
这种方法要创建好多cell严重消耗内存,不推荐使用。
2.使用UITableView的重用机制,但是给每个cell的id不一样,代码如下:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"cellId%li",indexPath.row]];
这种方法虽然用了UITableView的重用机制,但是也要创建好多cell,与方法一差不多,也不推荐使用。
3.使用UITableView的重用机制,但是在每次cell不为空的情况下移除子视图,代码如下:
static NSString *cellId = @"cellId";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}else{
// 判断cell.contentView如果有子视图则移除
while ([cell.contentView.subviews lastObject] != nil) {
[[cell.contentView.subviews lastObject] removeFromSuperview];
}
/**
// 这种方法也可以,这是OC提供的枚举,二者选其一就好,实现效果是一样的
[cell.contentView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
UIView *view = (UIView *)obj;
[view removeFromSuperview];
}];
*/
}
这种情况适合用了UITableView的重用机制,出现视图或是文字重叠,就可用这种方法,推荐使用。
必须根据自己的业务逻辑和代码实现判断是否使用,如果使用错误会造成已经创建的视图被移除。