41

对于 iPhone,是否可以配置 UITableView 使其允许多选?

我已经尝试-setSelected:animated:为每个 UITableViewCell 覆盖,但是试图捏造所需的行为是很棘手的,因为很难将真正的取消选择与 UITableView 认为我因选择另一个单元格而取消选择的取消选择区分开来!

希望有人能帮忙!

谢谢,

缺口。

4

12 回答 12

39

如果您正在为 iOS5.0+ 开发应用程序,以下属性应该可以正常工作

self.tableView.allowsMultipleSelection = YES;
于 2012-04-01T23:12:44.627 回答
37

最好的方法是对每个选定的行进行复选标记。

您可以通过将所选 UITableViewCell 实例上的 accessoryType 设置为 UITableViewCelAccessoryCheckmark 来做到这一点。

要取消选择该行,请将其设置回 UITableViewCellAccessoryNone。

要枚举选择了哪些单元格/行(例如,单击按钮时),只需遍历表格的单元格以查找 UITableViewCellAccessoryCheckmark。或者,在“did select”委托方法中的表视图委托中管理一些 NSSet 等。

于 2008-11-21T16:39:12.410 回答
25

使用以下代码设置单元配件类型:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];


    if (thisCell.accessoryType == UITableViewCellAccessoryNone) {
        thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        thisCell.accessoryType = UITableViewCellAccessoryNone;

    }
}

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {

//add your own code to set the cell accesory type.
return UITableViewCellAccessoryNone;
}
于 2009-03-23T20:58:07.213 回答
24

Jeff Lamarche 在此处提供了有关如何执行此操作的教程:

http://iphonedevelopment.blogspot.com/2008/10/table-view-multi-row-edit-mode.html

我还没有尝试过代码,但它一直在我脑海中浮现,我知道我需要它的那一天会到来。

于 2009-03-24T05:04:51.193 回答
11

我从 iOS5向后移植allowsMultipleSelectionDuringEditing到旧版 iOS。allowsMultipleSelection你可以在https://github.com/ud7/UDTableView-allowsMultipleSelection分叉它

它是替代品,您唯一需要做的就是将 UITableView 更改为 UDTableView(在代码或界面构建器中)

于 2011-12-04T05:15:02.020 回答
5

从HIG:

当用户选择列表项时,表格视图会提供反馈。具体来说,当可以选择一个项目时,包含该项目的行会在用户选择它时短暂突出显示,以表明已收到选择。然后,立即采取行动:要么显示一个新视图,要么该行显示一个复选标记以指示该项目已被选中。该行永远不会保持突出显示,因为表视图不会显示持久的选定状态。

您需要滚动自己的多选样式,或者使用邮件之类的东西,或者使用单元格上的复选标记附件。

于 2008-11-21T12:01:30.723 回答
5

多选的家伙,你只需要

self.tableView.allowsMultipleSelection = YES;

在 viewDidLoad 和

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = NO; 
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *tableViewCell = [tableView cellForRowAtIndexPath:indexPath];
    tableViewCell.accessoryView.hidden = YES;
    // if you don't use custom image tableViewCell.accessoryType = UITableViewCellAccessoryNone;
}
于 2012-12-11T20:31:22.503 回答
3

我正在寻找同样的问题,Bhavin Chitroda 的答案为我解决了这个问题,但添加了一些内容以保持滚动时的复选标记。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        if ( [array indexOfObject:indexPath] == NSNotFound ) {
            [array addObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else {
            [array removeObject:indexPath];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }

}

补充:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
// Your code here
.
.
.
    if ( [array indexOfObject:indexPath] == NSNotFound ) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    return cell;

}
于 2013-01-16T10:08:57.597 回答
2

如果您尝试执行 Mail 的多选(例如删除邮件)之类的操作,那么您可能必须自己管理所有选择。多行选择不是 iPhone 的标准功能。Mail 通过使用复选标记来指示已选择哪些行来解决此问题。

于 2008-11-21T11:46:22.797 回答
2

根据HIG第 121 页,实际上不鼓励将蓝色突出显示的行作为是否选择行的指示符。复选标记可以解决问题。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    int selectedRow = indexPath.row;
    cout << "selected Row: " << selectedRow << endl;
    UITableViewCell *indexPathForCell = [tableView cellForRowAtIndexPath:indexPath];
    if (indexPathForCell.accessoryType == UITableViewCellAccessoryNone) {
        indexPathForCell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        indexPathForCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

然后添加您的排列或您希望如何存储选择的数据。

于 2012-02-29T19:01:26.893 回答
1

注意:这在 iOS 4+ 中不起作用。这是一个私有的、未记录的常量。不要使用它。

如果您不打算将应用提交到 App Store,您可以通过在 UITableViewController 委托中实现以下方法来调用多行编辑模式:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 3; // Undocumented constant
}
于 2010-08-06T21:30:58.540 回答
0

使用 iOS4.3 - 6.0 测试

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {

    if ([controller.searchResultsTableView respondsToSelector:@selector(allowsMultipleSelectionDuringEditing)]) {
        controller.searchResultsTableView.allowsMultipleSelectionDuringEditing = YES;
    }
    else {
        controller.searchResultsTableView.allowsSelectionDuringEditing = YES;
    }
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellAccessoryCheckmark;
}
于 2012-11-12T10:52:13.320 回答