分组tableview中的多个选择

时间:2012-07-10 11:17:09

标签: iphone objective-c ios5 uitableview

我正在使用带有多个部分的分组tableview。 我必须在indexpath上实现didselectrow上的多项选择功能 方法。我的代码如下。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
} 

允许我选择多个单元格 但当我滚动我的tableview时,我的选择消失了。

4 个答案:

答案 0 :(得分:1)

当您滚动时,您的选择会消失,因为它会调用cellForRowAtIndexPath并且您无法处理选择。

要避免此问题,您可以执行以下操作: 在didSelectRowAtIndexPath中,您可以按如下方式保存所选行的索引路径:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        //remove index path
        [selectedIndexPathArray removeObject:path];
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [selectedIndexPathArray addObject:path];
    }
}

并在cellForRowAtIndexPath中,您可以检查是否选择了单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //If selectedIndexPathArray contains current index path then display checkmark.
    if([selectedIndexPathArray containsObject:indexPath])
       cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

答案 1 :(得分:0)

试试这个

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    if (self.tableView.isEditing) {
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    } else {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    return cell;
}

-(UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleMultiSelect;
}

-(IBAction) switchEditing {
    [self.tableView setEditing:![self.tableView isEditing]];
    [self.tableView reloadData]; // force reload to reset selection style
}

希望这有助于解决您的问题。(ref

答案 2 :(得分:0)

您的选择消失,因为将在滚动时调用方法CellForRowAtIndexPath。 您需要再次设置配件。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    // here
    ...
}

答案 3 :(得分:0)

您遇到此问题是因为您没有跟踪行选择。当回调方法 cellForRowAtIndexPath 为已消失的行/(向上/向下滚动)调用时,单元格对象不再记忆是否被选中。 (这些选择正在消失的原因)

我建议您使用像 NSMutableArray / NSArray 这样的集合来跟踪选定的行。 您可以使用这些方法中的任何一种。

这将是一个快速工作的修复: 根据用户选择在 didSelectRowAtIndexPath 中添加/删除索引路径对象 然后根据该数组的内容,你可以为相应的单元格切换cell.accessoryType的值。

理想情况下,您可以使用一个名为 selected 的布尔成员的数据bean / model,并且可以根据所做的选择更新其值。然后,您可以添加那些,而不是简单地添加这些索引路径有意义的数据bean对象到你的数组上并从bean的选择的属性中获取选择。即使用户杀死并重新启动应用程序,这种方法也可以帮助你恢复行选择如果你将bean对象保存在database / archive 中...(但这完全取决于你的用例和要求!)

希望这有帮助!