我有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];
}
要解决重用问题,当某些单元格有复选标记时,即使它们未被选中,我也会使用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部分保持单一选择 - 但允许两者同时选择一行。所以看起来应该是这样的:
而不是这样,当我从第2节中选择一行时,它看起来像这样:
答案 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];
}