iOS:cellForRowAtIndexPath不会在numberOfRowsInSection后立即调用

问题描述:

我有我的可用数据填充numberOfRowsInSection内的当前部分。然后我希望它调用cellForRowAtIndexPath,以便我可以使用这些数据。我在numberOfRowsInSection我覆盖了上一节的数据。做NSLog它显示numberOfRowsInSection运行的第一个cellForRowAtIndexPath之前的所有149个部分...为什么?iOS:cellForRowAtIndexPath不会在numberOfRowsInSection后立即调用

我已经删除了调用reloadData,因为我看到这是其他人在堆栈溢出问题,但没有解决问题。

每吉姆我正在添加我在做什么。

- (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 
} 
+0

@jostster为什么这会对您的应用程序有所帮​​助? – bneely 2012-02-23 17:17:44

+1

你所描述的听起来很奇怪。首先,你不应该在'numberOfRowsInSection'中覆盖任何东西。它应该只返回一个整数。可能需要更准确的细节。但我相信,一旦UITableView将这些委托方法踢掉,它就打算更新其视图中的某些内容。但它应该只是询问可见的部分和行。 – Jim 2012-02-23 17:20:10

+0

@Jim我修改了我的OP来显示我在做什么。 – Bot 2012-02-23 17:22:51

从一般意义上说,依靠Apple以任何特定模式调用委托函数并不是一个好习惯。

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

您无法对numberOfRowsInSection进行调用,因为这意味着系统不想知道某个节中有多少行。 :)

+0

+1非常好的答案。 – Till 2012-02-23 17:29:42

+1

好点...我忘了cellForIndexPath被调用,因为单元格开始进入视图...现在这是有道理的。 – Bot 2012-02-23 17:33:29

我的猜测是,UITableView的缓存数据,以便通过运行一次,并且得到的一切

它是UITableView类的工作..

没有被震撼at..and你赢了” T为能够改变的..

而且149个部分不应该一次装入..加载它们当用户滚动..

+0

那么你的说法numberOfRowsInSection在第一个单元格添加之前运行所有部分?我以为它在该部分的numberOfRowsInSection后面运行cellForIndexPath。 – Bot 2012-02-23 17:16:53

+0

不能这样工作..虽然我明白你的项目会更简单..像这样..但表视图这样工作 – Shubhank 2012-02-23 17:19:42

其U的行为ITableView。

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

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

如果您想刷新/更改您的表格,您应该更改model中的适当数据,然后调用tableView的[tableView reload....];方法之一(取决于您正在尝试更改的内容)。

UITableViewDelegate方法(特别是那些返回的行数,段......)不应该做比他们的名字所说的更多的事情,否则最终会导致您的表格或可能应用程序崩溃......

当您拨打[tableView reload....];时,您的内容提供方法将被调用,并且这是提供内容的地方。

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