tableView 的cell中加入了計算cell的高度並且呼叫代理方法,返回給視圖控制器當伺服器返回資料來源的時候,刷新tableView。 但是,此時執行的cellForRowIndexPath 的indexPaht 是從第四行開始的,,將前邊的幾個給跳過了,我試著將cell的高度寫成定值,結果cell的數量正常,這會是什麼問題?
應該是高度計算滯後了。 tableView的顯示順序大致是:請求 sectionNumber 和 numberForSection 取得總共有多少個section和cell。 sectionNumber 和 numberForSection 获取一共有多少个section和cell。请求 heightForRow:atIndexPath 获取即将显示在界面上的 cell 的高度。然后请求 cellForRow 获取这个 cell 的实例。然后设置 cell 的高度等,layout 之后调用 willDisplay請求 heightForRow:atIndexPath 取得即將顯示在介面上的 cell 的高度。
sectionNumber
numberForSection
heightForRow:atIndexPath
cellForRow
willDisplay
接著設定 cell 的高度等,layout 之後呼叫 willDisplay 等回呼方法,然後顯示在介面上。
所以你刷新 tableView 時高度這部分的處理應該是,先根據資料來源計算cell高度而不是讓cell實例計算好了再回調給控制器。當然,你也可以在cell中計算,例如在cell中有個類別方法,根據傳入的cell資料計算,並由控制器主動呼叫這個方法。大概程式碼如下:
在 controller 或 tableView 的 delegate 實作類別中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *cellData = self.dataSource[indexPath.row]; return [MyTableViewCell cellHeightForData:cellData]; }
+ (CGFloat)cellHeightForData:(NSDictionary *)cellData { // 根据 cellData 计算 cell 的高度 return height; }
應該是高度計算滯後了。
接著請求tableView的顯示順序大致是:
請求
sectionNumber
和numberForSection
取得總共有多少個section和cell。sectionNumber
和numberForSection
获取一共有多少个section和cell。请求
heightForRow:atIndexPath
获取即将显示在界面上的 cell 的高度。然后请求
cellForRow
获取这个 cell 的实例。然后设置 cell 的高度等,layout 之后调用
willDisplay
請求heightForRow:atIndexPath
取得即將顯示在介面上的 cell 的高度。cellForRow
取得這個 cell 的實例。接著設定 cell 的高度等,layout 之後呼叫
willDisplay
等回呼方法,然後顯示在介面上。所以你刷新 tableView 時高度這部分的處理應該是,先根據資料來源計算cell高度而不是讓cell實例計算好了再回調給控制器。當然,你也可以在cell中計算,例如在cell中有個類別方法,根據傳入的cell資料計算,並由控制器主動呼叫這個方法。大概程式碼如下:
在 controller 或 tableView 的 delegate 實作類別中:
🎜MyTableViewCell:🎜