iOS tableView數據源與代理方法的調用(一)

tableView在iOS中是最長使用的控件了,但在對于其中具體的代理以及數據源的調用順序相信好多人并不太清楚。剛好最近工作中遇到一個由于不熟悉其中的加載機制造成了一個很奇葩的BUG,于是順便研究了一下其中的設置行高和設置每行內容的兩個代理方法的調用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;? // 設置行高

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; // 設置每行的內容

先說說我遇到的奇葩bug:

由于我的cell的高度是自適應的,我把高度存在了一個字典中,用indexPath做key值,而這個高度只有在設置每行內容的時候才能計算出來,所以設置行高這個方法在開始的時候取到的一直沒有值,此時問題就出現了,就算后來開始加載的時候,設置每行內容這個方法不是從indexPath.row == 0 開始,而是從下標為1的時候開始的。

問題解決:只需在設置行高的時候沒有值時(準確說是當值為0時),默認設置一個大于0的數就可以了。

問題解決很簡單,但是這其中具體是怎么加載的呢?

1.當tableView在確定了加載的行數之后,會循環調用設置行高的方法,即有多少行調用多少次。假如此時行高一個都沒有設置(即設置行高的方法一直返回的0),此時設置行內容的方法就出現問題了,它不再是從indexPath{0-0}開始了,而是從總行數的一半開始(奇數行的話就是從行數加1除以2開始,偶數行從除以2開始)。

2.然后系統開始一行行的調用方法

先調用一次設置行高的方法,然后調用設置行內容的方法,然后又調用設置行高度的方法。

具體只涉及了這兩個方法,可能相對比較簡單,后續可能還會有相關的研究,當然也歡迎感興趣的一起討論。也歡迎大神給予指導。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容