1

我正在使用具有多个部分的分组表视图。而且我必须在 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;
    }
} 

这允许我选择多个单元格,但是当我滚动我的表格视图时,我的选择消失了。

4

4 回答 4

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;
}
于 2012-07-10T11:33:49.877 回答
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
}

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

于 2012-07-10T11:18:44.083 回答
0

您的选择消失了,因为该方法CellForRowAtIndexPath将在滚动时调用。您需要重新设置附件。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    // here
    ...
}
于 2012-07-10T11:21:02.123 回答
0

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

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

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

理想情况下,您可以使用带有一些名为selected的布尔成员的数据 bean/模型,并且您可以根据所做的选择更新其值。然后,您可以将那些有意义的数据 bean 对象添加到您的数组中,而不是简单地添加那些索引路径并获得从 bean 的选定属性返回选择。这种方法将帮助您取回行选择,即使用户杀死并重新启动应用程序,只要您将 bean 对象持久保存在数据库/存档中..(但这一切都取决于您的使用案例和要求!)

希望这有帮助!

于 2012-07-10T13:43:56.157 回答