![](/img/trans.png)
[英]cellForRowAtIndexPath: being called immediately while numberOfRowsInSection: is not called
[英]iOS: cellForRowAtIndexPath not being called immediately after numberOfRowsInSection
我在numberOfRowsInSection
的當前部分填充了我的應有數據。 然后,我希望它調用cellForRowAtIndexPath
以便我可以使用該數據。
在我的numberOfRowsInSection
我正在覆蓋上一節中的數據。 通過執行NSLog
它顯示在調用第一個cellForRowAtIndexPath
之前,所有149個節均運行numberOfRowsInSection
。為什么?
我已經刪除了對reloadData
調用,因為我在堆棧溢出時看到了這對其他人的問題,但這不能解決問題。
Per Jim,我要添加我正在做的事情。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSMutableArray *tempArray = [NSMutableArray array];
FMResultSet *appointmentResults = [[DataClass getDB] executeQuery:@"SELECT * FROM Appointments WHERE date = ?",[self.appointmentDates objectAtIndex:section]];
int rowCount = 0;
while ([appointmentResults next]) {
[tempArray addObject:[appointmentResults resultDict]];
rowCount++;
}
self.appointments = tempArray;
NSLog(@"Appointments: %@ - %i", [self.appointmentDates objectAtIndex:section], rowCount);
return rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Parse the appointments for the current section and display them
}
一般而言,依靠Apple以任何特定模式調用委托函數並不是一個很好的做法。
特別是對於UITableView,它只會在需要知道的基礎上請求數據。 UITableView更加需要知道整個表中有多少節和行,以便它可以正確處理諸如滾動位置和滾動條大小之類的事情,而實際的單元格內容可以被允許滑動,直到它們即將進入用戶視圖。
您不能對numberOfRowsInSection進行調用,這暗示着系統想要知道某節中有多少行之外,還沒有任何其他含義。 :)
它是UITableView的行為。
它將僅加載那些可見的單元格。 為了計算它,它將在顯示每個部分之前詢問每個部分的行數。
不可見的單元格cellForRowAtIndexPath
最初不會被調用。 用戶滾動瀏覽它時,它將被調用。
我也遇到同樣的情況。 我認為原因是表格返回的heightof行為0。
我的猜測是uitableview會緩存數據,因此運行一次並獲取所有內容
這就是UITableView
類的工作方式。
沒什么好震驚的,您將無法更改它。
另外,不應一次加載149個部分。隨着用戶滾動滾動它們。
如果要刷新/更改表,則應在model
更改適當的數據,然后調用tableView的[tableView reload....];
方法(取決於您要更改的內容)。
UITableViewDelegate
方法(尤其是那些返回行數,節數的方法)的作用不應該超過它們的名稱,否則您將導致表格完全混亂或應用程序崩潰……
當您調用[tableView reload....];
您提供內容的方法將被調用,這就是提供內容的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.