我有一个动态填充列表。如果变量是某个值,我试图让它返回任何内容。
这是我正在做的事情:
/* FIRST VALIDATE TIME LEFT TO MAKE SURE IT STILL EXIST */
NSString *check = [self.googlePlacesArrayFromAFNetworking[indexPath.row] objectForKey:@"time_left"];
if(![check isEqualToString:@"expired"])
{
return cell;
}
else
{
return NULL;
}
现在,如果expired
存在,则返回NULL
,但这不起作用。它崩溃时出现以下错误:
'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
我不知道如何解决这个问题,建议和想法?
大卫
更新:
cell
:
static NSString *CellIdentifier = @"timelineCell";
FBGTimelineCell *cell = (FBGTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [[FBGTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell initTimelineCell];
答案 0 :(得分:4)
您的数据源必须在其所有方法中返回一致的值。 tableView中的行数由numberOfRowsInSection
的返回值控制,cellForRowAtIndexPath
必须为每行返回一个有效的单元格。
必须在cellForRowAtIndexPath
之外执行数据源中数据的验证和修改,并调用[tableView reloadData]
或[tableView deleteRowsAtIndexPaths]
以更新表格显示
<强>更新强>
如果不了解驱动“过期”行为的原因,很难提供一个示例 - 这些数据是从Web服务检索的,还是检索后信息老化的结果。如果是前者,那么我建议您将数据从Web服务结果数组传输到驱动tableview的数组中,并在复制时过滤掉过期的数据。如果您需要定期扫描过期数据,则可以使用以下内容 -
你需要有一些东西,比如NSTimer
定期触发这个方法,或者你是从网络重新获取数据,这可能是运行这种方法的触发器 -
-(void)expireData
{
for (int i=0;i<self.googlePlacesArrayFromAFNetworking.count;++i) {
NSDictionary *dict=[self.googlePlacesArrayFromAFNetworking objectAtIndex:i];
if ([[dict objectForKey:@"time_left"] isEqualToString:@"expired"])
{
[self.googlePlacesArrayFromAFNetworking removeObjectAtIndex:i];
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:i inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
--i; // Array is now one element smaller;
}
}
}
请注意,此方法会修改self.googlePlacesArrayFromAFNetworking数组。如果这是不可接受的,那么您需要将此数组复制到另一个数组以驱动UITableView
。
另一种方法是在numberOfRowsInSection
中扫描数组并计算出有多少非过期元素并将其返回。然后在cellForRowAtIndexPath
中,你需要向前扫描数组以找到下一个未过期的元素;这很麻烦,因为你的indexPath行和你的数组索引将不同步。
答案 1 :(得分:3)
这取决于你想要什么。有两种选择:
-tableView:numberOfRowsInSection
返回正确的行数(也就是说,在从该方法返回之前,减去计算中过期行数)。然后,永远不会要求您的数据源提供该索引路径的单元格。 更新:当参数需要Objective-C对象时,您应该返回nil
,而不是NULL
。 nil
相当于(id)0,而NULL
相当于(void *)0
。 [source]
答案 2 :(得分:0)
您必须始终返回cell
。你需要的不是返回nil
,而是不填充它。