是否可以configuration一个UITableView允许多选?

对于iPhone,是否可以configuration一个UITableView,以便允许多选?

我已经尝试覆盖-setSelected:animated:为每个UITableViewCell,但试图-setSelected:animated:所需的行为是棘手的,因为它是很难分开真正的select从那里的UITableView认为我已经取消select另一个单元格!

希望有人能帮助!

谢谢,

缺口。

做到这一点的最好方法是每选定一行选中一个复选标记。

您可以通过将所选UITableViewCell实例上的accessoryType设置为UITableViewCelAccessoryCheckmark来实现此目的。

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

要枚举select了哪些单元格/行(例如,单击button时),只需遍历表的单元格以查找UITableViewCellAccessoryCheckmark。 或者,在“did select”委托方法中,在表视图委托中pipe理一些NSSet或类似的东西。

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

 self.tableView.allowsMultipleSelection = YES; 

使用下面的代码来设置单元格附件types:

  - (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; } 

Jeff Lamarche有一个关于如何在这里完成的教程:

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

我还没有尝试过这个代码,但是它已经在我脑海中一阵子了,知道一天会在我需要的时候到来。

我backported allowsMultipleSelectionDuringEditingallowsMultipleSelectionallowsMultipleSelection到较旧的iOS。 你可以在https://github.com/ud7/UDTableView-allowsMultipleSelection分叉;

它是在replace的下降,只有你需要做的是将UITableView更改为UDTableView(在代码或界面生成器)

从HIG:

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

你需要推出你自己的多种select风格,或者像Mail一样,或者在你的单元格上使用复选标记附件。

你只需要多重select的人

 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; } 

如果您正在尝试执行诸如Mail的多重select(例如删除邮件),那么您可能将不得不自己pipe理所有的select。 多行select不是iPhone上的标准。 邮件解决此问题通过使用复选标记来指示哪些行已被选中。

蓝色突出显示的行作为是否select行的指示符实际上是根据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; } } 

然后添加您的arrays,或者您希望如何存储所选数据。

我正在寻找同样的问题,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; } 

注意:这在iOS 4+中不起作用。 这是一个私人的,没有logging的常数。 不要使用它。

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

 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return 3; // Undocumented constant } 

testingiOS4.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; }