可以在每个部分中选择限制项目数

时间:2017-07-15 06:22:55

标签: ios objective-c uitableview

我在以下实现中遇到问题。我定义了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;
}

1 个答案:

答案 0 :(得分:2)

编辑:(在我的示例项目中尝试后)

willSelectRowAtIndexPath:方法的实现对我来说不正确。此外,indexPathForSelectedRow返回行选择数组中的第一个索引路径对象;因此总是返回第0个部分的第一个选定索引。

这是删除方法后的实现 - (void)selectedItem: (UITableView *)tableView和selectedRowsInSectionDictionary变量以及添加新的NSMutable字典变量,用于维护所选索引路径的数组{{ 1}}。

selectedIndexPathsInSectionDictionary

enter image description here

github link示例项目