我在以下实现中遇到问题。我定义了tableview中每个部分可以选择的最大项目数。
我们假设用户只允许在第0部分中选择两个项目。如果用户尝试选择第三个,则第一个将取消选择所选项目,第三项将具有复选标记附件。
我的以下实施无法处理,它允许包含所有复选标记的两个以上的项目。我想知道我做错了什么?
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
int numberOfItemsSelected = [[selectedRowsInSectionDictionary valueForKey: [NSString stringWithFormat:@"%ld",indexPath.section]] intValue];
if(((ComboItem*)comboItemsArray[indexPath.section]).itemNumberEachCombo == numberOfItemsSelected)
{
NSIndexPath *oldIndex = [self.comboTableView indexPathForSelectedRow];
[self.comboTableView cellForRowAtIndexPath:oldIndex].accessoryType = UITableViewCellAccessoryNone;
[self.comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
return nil;
}
else
{
return indexPath;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
[self selectedItem:self.comboTableView];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
[comboTableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
[self selectedItem:self.comboTableView];
}
- (void)selectedItem: (UITableView *)tableView {
selectedRowsInSectionDictionary = [NSMutableDictionary dictionary];
NSArray <NSIndexPath*> *selectedIndexPaths = [tableView indexPathsForSelectedRows];
for (NSIndexPath *indexpath in selectedIndexPaths) {
NSString *sectionKey = [NSString stringWithFormat:@"%ld",indexpath.section];
NSInteger numberOfSelectedRows = [[selectedRowsInSectionDictionary objectForKey: sectionKey] integerValue];
numberOfSelectedRows++;
[selectedRowsInSectionDictionary setObject:@(numberOfSelectedRows) forKey: sectionKey];
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
if([[tableView indexPathsForSelectedRows] containsObject:indexPath]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = ((ComboItem*)comboItemsArray[indexPath.section]).allComboItems[indexPath.row];
return cell;
}
答案 0 :(得分:2)
编辑:(在我的示例项目中尝试后)
willSelectRowAtIndexPath:
方法的实现对我来说不正确。此外,indexPathForSelectedRow
返回行选择数组中的第一个索引路径对象;因此总是返回第0个部分的第一个选定索引。
这是删除方法后的实现 - (void)selectedItem: (UITableView *)tableView
和selectedRowsInSectionDictionary变量以及添加新的NSMutable字典变量,用于维护所选索引路径的数组{{ 1}}。
selectedIndexPathsInSectionDictionary
github link示例项目