写过tableView的童鞋都知道,有必须的两个代理方法要实现,还有几个选择实现的。数组
必须实现的代理方法:iphone
~设置行数网站
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
~初始化并设置cell样式及内容ui
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
选择实现的代理方法:spa
~设置列表分组数3d
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // Default is 1 if not implemented
~设置每行高度代理
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
固然还有其余的,这里就不在粘贴了,注意这里列出的最后一个可选代理方法,这是个隐藏已久的坑。今天就来讲说这个code
话说今天处理iPhone 64位系统出现的弹框问题,在首次安装程序时会弹出警告的问题。blog
弹出警告的缘由是程序在编写时,未添加ARM给64的指令集,也就是“arm64”,用到该指令集的手机类型以下列出 ip
iPhone6s、iphone6s plus
iPhone六、iPhone6 plus
iPhone5S
iPad Air、iPad mini2(iPad mini with Retina Display)
注:摘自iOS中的armv7,armv7s,arm64,i386,x86_64都是什么
解决方法就是添加arm64到项目配置中:路径是Targate->Build Settings->Architechtures, 配置以下
添加以前的配置:
添加以后的配置:
可是,这只是个开始,Command+B以后,居然Build failed了。
程序不只有眼前的bug,还有远方未知的坑和改需求,但眼前的bug要先改完。
此次failed跟以往的不同,先来看一段代码
NSInteger numberOfArray = [testDic[@"testId"] count]; return numberOfArray;
这时段示例代码,假设有个字典键“testId”对应的值是一个数组,使用“[]”语法取数组的count值,按说是不该该出错的
可是这里确实出错了,提示大体意思是:不能有多个方法访问count属性
必须写成下面的形式才能够经过:
NSInteger numberOfArray = [((NSArray *)testDic[@"testId"]) count]; //此处强转,只取数组的个数没问题,若是改数组就会出问题 或者 NSArray *testArray = testDic[@"testId"]; NSInteger numberOfArray = [testArray count];
没办法,只能一个一个修改。去除左边框框里的全部红色后,终于Build Succeeded
------------------------------------------------------------
进入后感受如释重负,终于又干掉一个bug,因而像往常同样点了点几个主界面。
点到一个列表时,列表和个人心情都简直了😅 。。。😢...
这是属于个人战场,大战在即,开启全面警惕
半小时过去了,同事问我“好了吗?” --- 我伸个懒腰:“还没”
。。。
一个小时过去了
“好啦?” --- “我去一下厕所,减减压”
··· ···
是这个方法没作系统版本判断吗?
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:") __TVOS_PROHIBITED; // NSTextAlignment is not needed to determine size
改为下面的方法(参考:boundingRectWithSize:options:attributes:计算文本尺寸的使用)
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
然而,并无什么 用
··· ···
一个半小时过去了
忽然,想起了同事说过的一个坑,“我遇到那个这是个老坑了,别人跟我说的‘你看这里,加个CG就能够了’”。
而后我就去翻了翻那几个代理方法,就是在本文开始的时候特别提过的那个代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
可是程序中并非这么写的,而是
- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
原来,这个代理方法在之前的返回值并非CGFloat,而是一个float。
在iOS不断修改的过程当中,为适应32位系统和64位系统,float和double被替换为CGFloat(注意此处不是宏定义,参考:iOS typedef究竟是什么?),以下官方解释
CGFloat is just a typedef for either float or double. typedef float CGFloat;// 32-bit typedef double CGFloat;// 64-bit
好了,终于改掉了一个bug。若是你也遇到了,欢迎参考与指教。
另外我的新开了博客网站,欢迎路过。