寫過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。若是你也遇到了,歡迎參考與指教。
另外我的新開了博客網站,歡迎路過。