隐藏UITableViewCell

时间:2010-04-19 20:32:34

标签: iphone cocoa-touch

有没有办法隐藏UITableView单元格?我正在寻找一些属性或方法,我可以在同步cellForRowAtIndexPath()返回的UITableViewCell上调用它来隐藏它并让用户无法选择它。

5 个答案:

答案 0 :(得分:6)

对我来说使用映射并不容易,所以我决定使用SAS方法。但它不适用于我的自定义单元格。所以,我纠正了它:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 7 && hide7Row){
        UITableViewCell* cell = [cells objectAtIndex:indexPath.row];
        cell.hidden = YES;
        return 0.0;
    }
    else if(indexPath.row == 8 && hide8Row){
        UITableViewCell* cell = [cells objectAtIndex:indexPath.row];
        cell.hidden = YES;
        return 0.0;
    }
    else {
        return 44.0;
    }
}

工作正常。

答案 1 :(得分:5)

你的意思是在表格中留一个空格,或者只是从它之前的一个空格到它之后的一个空格?在前一种情况下,我猜您可能会尝试获取单元格contentView并将其hidden属性设置为YES;否则,您只需要在-tableView:numberOfRowsInSection:-tableView:cellForRowAtIndexPath:方法中做一点逻辑,从第一个方法返回(否则返回的单元格数量为1),并且取决于是否行索引小于或大于你不包括的行(你要返回的单元格)或(行索引+ 1处的单元格)。

(编辑,因为解释很复杂:)

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    if(section == theSectionWithoutARow)
    {
        if(shouldRemoveTheRow)
            return [theArrayWithTheSectionContents count] - 1;
        else
            return [theArrayWithTheSectionContents count];
    }
    // other sections, whatever
}

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // blah blah standard table cell creation

    id theCellObject;

    if(indexPath.section == theSectionWithoutARow)
    {
        NSInteger theActualRowToDisplay = indexPath.row;
        if(shouldRemoveTheRow && indexPath.row >= theRowIndexToRemove)
        {
            theActualRowToDisplay = indexPath.row + 1;
        }
        theCellObject = [theArrayWithTheSectionContents objectAtIndex:theActualRowToDisplay];
    }

    // now set up the cell with theCellObject

    return cell;
}

答案 2 :(得分:2)

据我所知,在cellForRowAtIndexPath上没有方法可以做到这一点。

Noah Witherspoon的方法似乎或多或少可行,但如果你想要隐藏多行,则需要修改它。

另一种接近它的方法是创建一个“单元格地图”,我不知道这是否更有效,但我已经使用它并且它有效。

我们假设您有一个NSArray(或其可变版本)的数据,将在您的TableView中显示。数组的count属性用作numberOfRowsInSection委托方法的返回值。据我所知,这是一种典型的方法。

为了使它只显示一些行,我创建了一个“映射数组”,它是一个NSMutableArray,它包含指向实际数据数组的“指针”。该映射包含NSNumbers中包含的整数。在其处女状态中,映射的索引0具有整数0(包含在NSNumber中),索引1具有整数1,等等。

构建UITableView委托方法,以便将map的索引计数用于numberOfRowsInSection。在cellForRowAtIndexPath方法中,它查看映射数组的相应索引,检索包含在NSNumber中的任何内容,然后在中查找实际数据数组的索引。

这种取消引用的好处是,从表中添加和删除单元格变得非常容易。只需在映射数组中添加/删除NSNumber对象即可。合理?对不起,不是我的Mac,或者我可以提供一些代码示例。

哦,不要忘记你必须在TableView上调用更新方法(确切的名称逃避我),以便它刷新并隐藏/取消隐藏。

答案 3 :(得分:2)

有同样的问题,并且我想避免上面提到的一些映射,我只是将cell-size设置为0:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger row=[indexPath row];
    float ret=0.0;

    if( row==3) {
        ret=0.0;
    }
    else {
        ret=40.0;
    }
    return ret;
}

答案 4 :(得分:1)

我使用Matt的技术来创建到单元格数据的映射。这是一些代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return computeNumberOfRowsAndMapCellData;
}

// Compute mapToCellData to map the index of the cell to the cell data for the 
// cell based on TaskConfig show/hide.
// Return the number of rows in section 1.
- (NSInteger)computeNumberOfRowsAndMapCellData {
    if (mapToCellData) {
        [mapToCellData release];
    }
    mapToCellData =[[NSMutableArray alloc] init];
    if (cellData) {
        [cellData release];
    }
    cellData = [[NSMutableArray alloc] init];

    NSInteger numberOfRows = 12;  // maximum number of rows
    NSNumber *index = [NSNumber numberWithInt:0];

    // If the data is not configured to show, decrement the number of rows in the table. 
    if ( ! [configManager isShowDateForType:task.case_type severity:task.severity]) {
        numberOfRows--;
    } else {
        // Add a map to the cell data with the row number.
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[df stringFromDate:task.respond_due_date], @"Respond Due", nil];
        [cellData addObject:dict];
        [mapToCellData addObject:index];
        int value = [index intValue];
        index = [NSNumber numberWithInt:value + 1];
    }
    // Check the configuration for the rest of the rows of cell data.
    ....
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];        
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:15];
        cell.detailTextLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
    }

    NSUInteger mapIndex = 0;

    // Use the mapToCellData to find cell data based on show/hide in ConfigManager for the data type.
    mapIndex = [indexPath row];
    NSNumber *cellDataIndex = [mapToCellData objectAtIndex:mapIndex];
    NSDictionary *cellDataDict = [cellData objectAtIndex:[cellDataIndex unsignedIntegerValue]]; 
    cell.textLabel.text = = [[cellDataDict allValues] objectAtIndex:0];
    cell.detailTextLabel.text = [[cellDataDict allKeys] objectAtIndex:0];