iOS UITableViewCell 出现返回为空

2019-09-13 22:56栏目:编程学习

图片 1CD44B3D0-FACC-4E3A-AF03-488880FE5401.png

上海教室直接给我们看看大家公司工作须求吧 以及做出来的作用图。

相遇这种主题材料,多半是cell的identifier没设置科学,导致cell找不到。设置科学后,就解决该难题。

图片 2gif5新文件-1.gif

图片 354C34215-6113-4DB0-9754-E97FAA9EA24B.png

须求正是这么 自动去适应tableview的cell高度 并实时总括中度。

此处笔者给大家推荐三种办法去做自适应

A: 使用第三方 FDTemplateLayoutCell Masonry

框架地址:FDTemplateLayoutCell

UITableView FDTemplateLayoutCell 是三个由国人团队开辟的优化总计UITableViewCell 高度的轻量级框架,由于达成逻辑简金朝晰,代码也不复杂,特别适协作为菜鸟学习。总括一下:1、iOS8 以前虽说应用 autoLayout 比较 frame layout 得手动总括已经简化了数不清(设置 estimatedRowHeight 属性并对约束设置科学的 cell 的 contentView 实践systemLayoutSizeFittingSize: 方法),但要么要求部分情势化步骤,同时还只怕境遇有的蛋疼的标题比如UILabel 折行时的莫斯中国科学技术大学学总括;2、iOS8 推出 self-sizing cell 后,一切都变得自在格外——做好约束后,直接设置 estimatedRowHeight 就好了。不过事情并不轻便,一来大家照样亟待做 iOS7 的适配,二来 self-sizing 并不设有缓存机制,不论曾几何时都会再一次总结 cell 高度,导致 iOS8 下页面滑动时会有醒指标卡顿。由此,这么些框架的目标,引用阳神的原话,正是“既有 iOS8 self-sizing 成效轻松的 API,又足以高达 iOS7 流畅的滑行效果,还维持了最低扶助 iOS6”。

感言相当少说 发轫吧~

- registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS;- registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS;
静心 :此处不管您是用代码依旧 XIB 成立的 cell,必得先实行登记(类似 UICollectionView):(不然 哈哈 你会懵逼的)

a. 运营崩溃报错 NSAssert(templateCell != nil, @"Cell must be registered to table view for identifier - %@", identifier);

由来:官方是那般说明的:和各种 UITableViewCell ReuseID 一一对应的 template layout cell这么些 cell 只为了参与高度计算,不会真的呈现到荧屏上;它经过 UITableView 的 -dequeueCellForReuseIdentifier: 方法 lazy 成立并保存,所以供给这些ReuseID 必需已经被注册到了 UITableView 中,也便是说,要么是 Storyboard 中的原型 cell,要么正是应用了 UITableView 的 -registerClass:forCellReuseIdentifier: 或 -registerNib:forCellReuseIdentifier:个中之一的登记情势。化解:意思正是说您须求注册cell对应的identifier。

所以说吗注册是很有必不可缺的一步!!!

/identifier 即 cell 的 identifier;configuration block 中的代码应与数据源方法 tableView: cellForRowAtIndexPath: 中对 cell 的装置代码一样格局内部将依靠以上七个参数成立与 cell 对应的 template layout cell,那几个 cell 只进行中度总括,不会显获得显示屏上/

 - fd_heightForCellWithIdentifier:(NSString *)identifierconfiguration:configuration;// 返回计算好的高度 - fd_heightForCellWithIdentifier:(NSString *)identifiercacheByIndexPath:(NSIndexPath *)indexPathconfiguration:configuration;// 返回计算好的高度,并根据 indexPath 内部创建与之相应的二维数组缓存高度 - fd_heightForCellWithIdentifier:(NSString *)identifiercacheByKey:(id<NSCopying>)keyconfiguration:configuration;// 返回计算好的高度,内部创建一个字典缓存高度并由使用者指定 key

像酱紫写↓

图片 4ppp.png

相似的话 cacheByIndex帕特h: 方法非常“傻瓜”,能够直接消除所用难题。cacheByKey: 方法稍显复杂,但在缓存机制上相比 cacheByIndexPath: 方法尤其迅猛。因而,像类似博客园、新闻这种会怀有独一标识的 cell 数据模型,更建议利用cacheByKey: 方法。

对于 cacheByIndexPath: 方法,框架内对 9 个触发 UITableView 刷新机制的国有方法分别开展了拍卖,保障缓存数组的科学;同时,还提供了一个UITableView 分类方法:

- fd_reloadDataWithoutInvalidateIndexPathHeightCache; 

用来供给刷新数据但不想移除原有缓存数据(框架内对 reloadData 方法的拍卖是清空缓存)时调用,举个例子大范围的“下拉加载更加大多据”操作。对于 cacheByKey: 方法,当 cell 高度发生变动时,必需手动管理:

[tableView.fd_keyedHeightCacheinvalidateHeightForKey:key]; // 移除 key 对应的高度缓存 [tableView.fd_keyedHeightCacheinvalidateAllHeightCache]; // 移除所有高度缓存 

设若要求查阅 debug 打字与印刷新闻,设置 fd_debugLogEnabled 属性:

tableView.fd_debugLogEnabled = YES; 

可观获取

作者们一向以 cacheByIndexPath: 方法源码为例举办驾驭(cacheByKey: 方法的达成千篇一律)

- fd_heightForCellWithIdentifier:(NSString *)identifiercacheByIndexPath:(NSIndexPath *)indexPathconfiguration:configuration { // 1. 如果 identifier 和 indexPath 为空,返回高度为 0 if (!identifier || !indexPath) { return 0; } // 2. 通过 FDIndexPathHeightCache 类声明的方法检查是否存在相应缓存 if ([self.fd_indexPathHeightCacheexistsHeightAtIndexPath:indexPath]) { // 打印 debug 信息 [self fd_debugLog:[NSStringstringWithFormat:@"hit cache by index path[%@:%@] - %@", @(indexPath.section), @(indexPath.row), @([self.fd_indexPathHeightCacheheightForIndexPath:indexPath])]]; // 提取并返回对应缓存中的额高度 return [self.fd_indexPathHeightCacheheightForIndexPath:indexPath]; } // 3. 如果没有缓存,通过 fd_heightForCellWithIdentifier: configuration: 方法计算获得 cell 高度 CGFloatheight = [self fd_heightForCellWithIdentifier:identifierconfiguration:configuration]; // 4. 通过 FDIndexPathHeightCache 类声明的方法将高度存入缓存 [self.fd_indexPathHeightCachecacheHeight:heightbyIndexPath:indexPath]; // 打印 debug 信息 [self fd_debugLog:[NSStringstringWithFormat: @"cached by index path[%@:%@] - %@", @(indexPath.section), @(indexPath.row), @]]; return height; 

}

fd_heightForCellWithIdentifier: configuration: 方法会依据 identifier 以及 configuration block 提供八个和 cell 布局同样的 template layout cell,并将其扩散 fd_systemFittingHeightForConfiguratedCell: 这一个私有方法重临计算出的惊人。

整合masonry 搭建页面时, 设为一定高度是尚未难题的,可是利用框架缓存cell中度时,cell重叠全数cell中度都为0。 知道为何吗?

由来:总结cell中度时,因Y方向上约束不到家,不可能分明cell的莫斯中国科学技术大学学。

图片 53563A1D5-3ACA-45D5-A632-1C5BE605E821.png

减轻:设置约束时,由上到下设置,最后四个要求安装距尾部边距。一定能让系统鲜明那么些cell的莫斯中国科学技术大学学

B: Masonry 手动总括行高

有关手动计算高度 ,怎么去做啊。能够如此给咱们说 RowHeight = 固定中度 非固定高度;

图片 60E215188-916B-4ADF-9458-3CEB57A4B0E4.png

恒定:每三个控件之间的空闲 这些是定点的 如上海体育场地:客商名、收回开关一样也是定位中度。非固:如上海体育场地中的message信息、和上面包车型地铁banner 为不稳固

1.在tableviewCell里面约束好有关控件 怎么约束去走访

在动用Masonry约束好不无关系控件之后。我们就该去手动总括我们的行高了。

2.自定义三个Model

.h#import "BaseModel.h"

@interface GrassdetailModelTwo : BaseModel@property(nonatomic,assign)CGFloat rowHeight;//行高 -updataModel;@end

.m

#import "GrassdetailModelTwo.h"#import "BrandView.h"@implementation GrassdetailModelTwo -updataModel{UILabel * testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, WIDTH-FitWidth];testLabel.text = self.describe;testLabel.font = [UIFont fontWithName:@"PingFangSC-Regular" size:FitValue];testLabel.numberOfLines = 0;[testLabel sizeToFit];CGFloat labelHeight = testLabel.frame.size.height  1;testLabel = nil;}
.boundingRectWithSize:
.sizeThatFits
.sizeToFit
.sizeWithAttributes

3.在TableView 代办重返中度

- tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSArray * arr = _dataArr[indexPath.section]; GrassdetailModelTwo * model = arr[0]; return model.rowHeight;}

版权声明:本文由威尼斯人app发布于编程学习,转载请注明出处:iOS UITableViewCell 出现返回为空