分组UITableView - 允许多个选择和单个选择

时间:2014-04-23 10:03:05

标签: ios uitableview

我有UITableViewNSArray获取数据。该数组包含模型对象。我已将UITableView分成几部分。现在我试图让一些部分可以多选,而其他部分只能单一选择。我的模型对象有一个属性,我用它来确定我是否需要多选或单选。我几乎就在那里 - 我已经设法在正确的部分进行多选和单选。这是代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.selectedIndexPath = indexPath;
    BBFilterProductAttribute *productAttribute = self.productAttributes[indexPath.section];

    if ([productAttribute.filterType isEqualToString:@"MULTI_SELECT_LIST"]) {
        if (productAttribute.option[indexPath.row]) {
            [self.selectedRows addObject:indexPath];
        }
        else {
            [self.selectedRows removeObject:indexPath];
        }
    }

    [self.tableView reloadData];
}

要解决重用问题,当某些单元格有复选标记时,即使它们未被选中,我也会使用cellForForAtIndexPath:方法执行此操作:

if([self.selectedRows containsObject:indexPath]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

//For single selection 
else if (self.selectedIndexPath.row == indexPath.row &&
         self.selectedIndexPath.section == indexPath.section) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

我对每个部分的选择正在按预期工作。每个部分允许多选或单选 - 取决于if方法中的didSelectRowAtIndexPath:语句。

问题是:

如果我在第2部分选择一行,让我们说出它的单一选择,然后我在第3部分中选择一行,也是单一选择,复选标记从第2部分移到第3部分。

我需要第2部分和第3部分保持单一选择 - 但允许两者同时选择一行。所以看起来应该是这样的:

  • 第1节:(多选):选择所有行
  • 第2节:(单项选择):选择一行
  • 第3节:(单项选择):选择一行

而不是这样,当我从第2节中选择一行时,它看起来像这样:

  • 第1节:(多选):选择所有行
  • 第2节:(单一选择:删除上一个选择
  • 第3节:(单项选择):选择一行

1 个答案:

答案 0 :(得分:2)

didSelectRowAtIndexPath:更改为

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.selectedIndexPath = indexPath;
    BBFilterProductAttribute *productAttribute = self.productAttributes[indexPath.section];

    if ([productAttribute.filterType isEqualToString:@"MULTI_SELECT_LIST"])
    {
        if (productAttribute.option[indexPath.row])
        {
            [self.selectedRows addObject:indexPath];
        }
        else
        {
           [self.selectedRows removeObject:indexPath];
        }
    }
    else
    {
        //Section is SINGLE_SELECTION
        //Checking self.selectedRows have element with this section, i.e. any row from this section already selected or not
        NSPredicate *predicate = [NSPredicate predicatewithFormat:@"section = %d", indexPath.section];
        NSArray *filteredArray = [self.selectedRows filteredArrayUsingPredicate:predicate];
        if ([filteredArray count] > 0)
        {
            //A row from this section selected previously, so remove that row
            [self.selectedRows removeObject:[filteredArray objectAtIndex:0]];
        }

        //Add current selected row to selected array
        [self.selectedRows addObject:indexPath];
    }

    [self.tableView reloadData];    
}