1. tableView使用时发现的问题
1.1 tableView 加载cell 崩溃:_configureCellForDisplay:forIndexPath
1.1. Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.6.21/UITableView.m:8042
分析: 控制器未声明实现协议tableviewDelegate ,tableviewDataSourse ; 错误发生在注册cell 的使用
ps: 另外还有常见的xib 中的cell 未设置相应的identifiter ; 还会遇到未设置代理:数据源,导致协议的方法不执行的问题
1.2 tableview 的UI细节
a. 分割线是否显示:self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
b. 点击后恢复点击状态: tableView.deselectRow(at: indexPath, animated: true)
1.3 tableView 加载问题
描述:嵌套使用collectionView 和tableView ,在collectionCell 的layoutSubviews 里面注册 tableView的cell,导致崩溃,原因是注册时机太晚,加载tableCell 的时候,发现tableCell 没有注册成功,重用失败崩溃
在ios8.3/8.4 必崩
总计:tableCell 的注册应该放在collectionCell 的awakeFromNib 方法里面,在一开始加载xib 的的时候就注册就可以解决问题了,这是对*awakeFromNib* 和**layoutSubviews** 的加载时机没有理解正确导致的
正确例子如下:awakeFromNib 是collectionCell 的方法:
- (void)awakeFromNib{
[super awakeFromNib];
[self.tableView registerClass:[UITableViewCellVedio class] forCellReuseIdentifier:[UITableViewCellVedio identifer_cell]];
}
错误例子如下:
/*崩溃在ios8.3/8.4 上面;改成上面的额方式注册*/
-(void)layoutSubviews{
[super layoutSubviews];
[self.tableView registerClass:[HomeWorkQuestionNameCell class] forCellReuseIdentifier:QuestionNameCell];
[self.tableView registerClass:[UITableViewCellVedio class] forCellReuseIdentifier:[UITableViewCellVedio identifer_cell]];
}
1.4 tableView 加载问题(ios8)
描述:崩溃提示*** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-3347.44/UITableView.m:6245
执行cellforRow cell 生成崩溃,只发生在ios 8的系统上面
错误代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[self.tableView registerNib:[UINib nibWithNibName:@"LearningCenterServiceCell" bundle:nil] forCellReuseIdentifier:@"LearningCenterServiceCell"];
}
错误分析:setSeparatorStyle方法 导致viewLoad 里面的代码加载顺序发生变化,没有执行注册cell 的方法就执行了tableView 的代理方法,重用方式生成cell 的时候,cell 没有注册导致方法崩溃
正确代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view
[self.tableView registerNib:[UINib nibWithNibName:@"LearningCenterServiceCell" bundle:nil] forCellReuseIdentifier:@"LearningCenterServiceCell"];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
}
总结:尽可能早的让cell 注册是防止iOS SDK 差异导致代码执行顺序和一些方法的时机出现问题导致crash ,这里面的坑之前比较少遇到因为很多时候不手动代码设置separatorStyle ,在xib 里面设置比较多,所以没有出现过问题,今天就猜到了,不过>=9.0 的系统苹果已经调整这个限制,顺序没那么关键了
1.5 tableView 的reloadSections 刷新方法崩溃:
具体分析参考:iOS的那些bug崩溃 中的第二条
1.6 关于tabelView 的方法细节:cellForRowAtIndexPath 和willDisplayCell 的差异
cellForRowAtIndexPath方法只负责创建cell,cellForRowAtIndexPath是data source协议中一个必须实现的方法,willDisplayCell方法才给cell进行赋值操作,willDisplayCell是delegate协议中一个可选的方法。
tableView: cellForRowAtIndexPath: 创建或者从重用队列里面取出cell,不会马上显示,所以不要在这里对cell进行数据填充
tableView: willDisplayCell: forRowAtIndexPath: 这里就是需要显示了,所以数据填充在这里进行,
以上只是针对比较复杂的cell才这样做,一般的都放在tableView: cellForRowAtIndexPath: 即可
2.swift 调用oc 的时候,方法不能自动匹配识别,需要手动拼写转换后的方法<首先要保证oc头文件引入到桥接文件中>
oc 方法:
+ (void)produceNavSeatWorkWithCourseId:(NSInteger)cid lessonId:(NSInteger)lid type:(HomeWorkType)type success:(void(^)(SeatWorkViewController * seatWork,BOOL isDone))success failure:(void(^)(NSError * error))failure;
转换后的swift 方法:
SeatWorkViewControllerManager.produceNavSeatWork(withCourseId:cid, lessonId:lid,type:HomeWorkType.nomal, success: { (seatWork:SeatWorkViewController!,isDone:Bool) in
//doSomthing
}) {(error:Error?) in
}
3. 0 xib设置UITextField的私有属性placeholderColor
在使用UITextField时发现在公开的属性里面并没有用来设置placeholderColor的属性,这样很难满足设计师的需求,通过xib可以轻松设置UITextField的placeholderColor,同样首先也需要进入上面步骤的那个页面,然后添加 placeholderLabel.textColor 的键值对来设置颜色