写过tableView的童鞋都知道,有必须的两个代理方法要实现,还有几个选择实现的。
必须实现的代理方法:
~设置行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
~初始化并设置cell样式及内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
选择实现的代理方法:
~设置列表分组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // Default is 1 if not implemented
~设置每行高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
当然还有其他的,这里就不在粘贴了,注意这里列出的最后一个可选代理方法,这是个隐藏已久的坑。今天就来说说这个
话说今天处理iPhone 64位系统出现的弹框问题,在首次安装程序时会弹出警告的问题。
弹出警告的原因是程序在编写时,未添加ARM给64的指令集,也就是“arm64”,用到该指令集的手机类型如下列出
iPhone6s、iphone6s plus
iPhone6、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 NSDictionaryid> *)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。如果你也遇到了,欢迎参考与指教。
另外个人新开了博客网站,欢迎路过。
分享曾经的收获