iOS:numberOfRowsInSection后不立即调用cellForRowAtIndexPath

时间:2012-02-23 17:07:05

标签: iphone objective-c uitableview ios5

我为numberOfRowsInSection内的当前部分填充了我的可用数据。然后,我希望它可以调用cellForRowAtIndexPath,以便我可以使用该数据。

在我的numberOfRowsInSection我正在覆盖上一节中的数据。执行NSLog它会显示numberOfRowsInSection在调用第一个cellForRowAtIndexPath之前为所有149个部分运行...为什么?

我已经删除了对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
}

6 个答案:

答案 0 :(得分:9)

从一般意义上讲,依靠Apple以任何特定模式调用您的委托函数并不是一种很好的做法。

特别是UITableView,它只会在需要知道的基础上请求数据。 UITableView更需要知道整个表中有多少部分和行,以便它可以正确处理滚动位置和滚动条大小等内容,同时可以允许实际单元格内容滑动直到它们即将进入用户的观点。

您不能将numberOfRowsInSection调用为暗示系统想要知道某个部分中有多少行的内容。 :)

答案 1 :(得分:2)

它是UITableView的行为。

它只会加载那些可见的单元格。要计算它,它会在显示每个部分之前询问行数。

不可见的单元格cellForRowAtIndexPath最初不会被调用。一旦用户滚动它就会被调用。

答案 2 :(得分:0)

我的猜测是uitableview缓存数据如此运行一次并获取所有内容

答案 3 :(得分:0)

这是UITableView类的工作原理..

没有什么可以被震惊的......你将无法改变它......

同时不应加载149个部分。在用户滚动时加载它们。

答案 4 :(得分:0)

如果要刷新/更改表格,则应更改model中的相应数据,然后调用tableView的[tableView reload....];方法之一(取决于您要更改的内容)。

UITableViewDelegate方法(尤其是那些返回行数,部分......)的方法不应该比它们的名称所做的要多得多,否则你最终会得到一堆乱七八糟的表或应用程序崩溃。 ..

当您致电[tableView reload....];时,您的内容提供方法将被调用,这就是提供内容的地方。

答案 5 :(得分:0)

我也得到同样的情况。我认为原因是表格的行返回高度为0。