美文网首页
开发中遇到的坑

开发中遇到的坑

作者: iOS打怪升级 | 来源:发表于2017-06-07 09:31 被阅读159次

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 的键值对来设置颜色


这里写图片描述

相关文章

  • iOS开发中遇到过的坑

    iOS开发中遇到过的坑 iOS开发中遇到过的坑

  • 开发中遇到的坑

    1. tableView使用时发现的问题 1.1 tableView 加载cell 崩溃:_configureCe...

  • 开发中遇到的坑

    1.android N开始,必须用fileprovider来获取uri中的文件。 2.android O开始,安装...

  • 开发中遇到的坑

    WKWebView 设置userAgent 代码如下: 根据上面代码设置后,可能会在iOS11以上的系统中第一次设...

  • iOS开发中遇到的坑

    从事iOS开发已有数年,一路走来踩过无数的坑,然而都踩过哪些坑,如今想来脑子里竟是一片空白,为什么呢?仔细想了想,...

  • php开发中遇到的坑

    本文用于记载个人在开发中遇到的坑 js对json 对象数字键值自动排序,直接贴代码 页面输出如下 控制台打印结果如...

  • iOS 开发中遇到的坑

    1.使用百度地图报BMK_SEARCH_PERMISSION_UNFINISHED(还未完成鉴权,请在鉴权通过后重...

  • ionic开发中遇到的坑

    1.打包的时候出错: Execution failed for task ':transformClassesWi...

  • Android开发中遇到的坑

    layout: posttitle: Android开发中遇到的坑date: 2015-05-26categori...

  • Android 开发中遇到的坑

    Binary XML file line #6: Error inflating class fragment 大...

网友评论

      本文标题:开发中遇到的坑

      本文链接:https://www.haomeiwen.com/subject/wpdofxtx.html