gpt4 book ai didi

ios - 分组的 UITableView - 允许多选和单选

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:08 26 4
gpt4 key购买 nike

我有一个 UITableView,它从 NSArray 获取数据。该数组包含模型对象。我已将 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];
}

为了解决重用问题,当一些单元格有复选标记时,即使它们没有被选中,我在我的 cellForAtIndexPath: 方法中这样做:

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;
}

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

问题是:

如果我在第 2 部分选择一行,假设它是单选,然后我在第 3 部分选择一行,也是单选,复选标记从第 2 部分移动到第 3 部分。

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

  • 第 1 部分:(多选):选中所有行
  • 第 2 部分:(单选):选中一行
  • 第 3 部分:(单选):选中一行

取而代之的是,当我从第 2 部分选择一行时,它看起来像这样:

  • 第 1 部分:(多选):选中所有行
  • 第 2 部分:(单选:移除之前的选择
  • 第 3 部分:(单选):选中一行

最佳答案

将您的 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];
}

关于ios - 分组的 UITableView - 允许多选和单选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23241019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com