簡體   English   中英

iOS:在numberOfRowsInSection之后沒有立即調用cellForRowAtIndexPath

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM