8

基本上,该cellForRowAtIndexPath函数需要返回一个 UITableViewCell。在我的代码中,我想检查一个行为,该行为将检查某些内容并在找到特定值时跳过单元格。

这是我现在拥有的:

static NSString *FirstCellIdentifier = @"First Custom Cell";
static NSString *SecondCellIdentifier = @"Second Custom Cell";

CustomObject *o = [_customObjects objectAtIndex:indexPath.row];

if ([s.name isEqualToString:@""])
{
    FirstCellController *cell = [customList dequeueReusableCellWithIdentifier:FirstCellIdentifier];
    if (!cell) { 
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"FirstCustomCell" owner:self options:nil];
        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (FirstCellController *) currentObject;
                break;
            }
        }
    }
    // Here I do something with the cell's content
    return cell;
}
else {
    SecondCellController *cell = [customList dequeueReusableCellWithIdentifier:SecondCellIdentifier];
    if (!cell) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SecondCustomCell" owner:self options:nil];
        for (id currentObject in topLevelObjects){
            if ([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (SecondCellController *) currentObject;
                break;
            }
        }
    }
    // Here i do something with the cell's content
    return cell;
}

我想做的是,如果s.name不为空,我想“跳过”单元格,不显示它并转到下一个。

请问有人对此有什么建议吗?

谢谢。

4

3 回答 3

22

您不能以这种方式“跳过”一个单元格。如果您的数据源声称有n行,那么您必须为每个行提供一个单元格。正确的方法是修改您的数据源以(n-1)在您想要删除行时声明行,然后调用 UITableViewreloadData让它重新生成表(并要求您为每个可见行提供新单元格)。

另一种选择是“隐藏”行/单元格。我为此使用的技术是通过以下方式为给定单元格提供 0 的高度heightForRowAtIndexPath

于 2012-10-11T16:02:19.470 回答
1

就像汤姆说的那样,不要尝试在 UITableViewDelegate 方法中“跳过”,而是将此逻辑放在 UITableViewDataSource 方法中......例如,您可以设置一个通用方法来过滤掉您的数据:

- (NSArray*)tableData {
    NSMutableArray *displayableObjects = [NSMutableArray array];
    [displayableObjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        CustomObject *customObject = (YourCustomObject *)obj;
        if (customObject.name && ![customObject.name isEqualToString:@""]) {
            // only show in the table if name is populated
            [displayableObjects addObject:customObject];
        }
    }];
    return displayableObjects;
}

然后在您的数据源方法中,使用它来获取您希望在表中显示的预过滤数据:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[self tableData] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CustomObject *o = [[self tableData] objectAtIndex:indexPath.row];
    ....
}

这样,每当调用 reloadData 时,它总是会在构建单元格时跳过过滤的数据。

于 2012-10-11T16:21:10.730 回答
-1

您可以通过不在表格视图中显示单元格来跳过它。(我假设这就是你想要的)只需使用这个:

cell.hidden = YES;
return cell

编辑:不是一个有效的解决方案。(留空白代替单元格)

于 2014-01-08T13:33:23.617 回答