繁体   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