基于数据返回nill单元格

时间:2014-04-14 01:55:12

标签: ios objective-c uitableview

我有一个动态填充列表。如果变量是某个值,我试图让它返回任何内容。

这是我正在做的事情:

/* 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];

3 个答案:

答案 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)

这取决于你想要什么。有两种选择:

  1. 如果您希望表视图的已过期数据为空行,则需要配置并返回一个空白单元格。
  2. 如果您希望丢失这些单元格,则需要为-tableView:numberOfRowsInSection返回正确的行数(也就是说,在从该方法返回之前,减去计算中过期行数)。然后,永远不会要求您的数据源提供该索引路径的单元格。
  3. 顺便说一下,

    更新:当参数需要Objective-C对象时,您应该返回nil,而不是NULLnil相当于(id)0,而NULL相当于(void *)0。 [source]

答案 2 :(得分:0)

您必须始终返回cell。你需要的不是返回nil,而是不填充它。