对于 iPhone,是否可以配置 UITableView 使其允许多选?
我已经尝试-setSelected:animated:
为每个 UITableViewCell 覆盖,但是试图捏造所需的行为是很棘手的,因为很难将真正的取消选择与 UITableView 认为我因选择另一个单元格而取消选择的取消选择区分开来!
希望有人能帮忙!
谢谢,
缺口。
对于 iPhone,是否可以配置 UITableView 使其允许多选?
我已经尝试-setSelected:animated:
为每个 UITableViewCell 覆盖,但是试图捏造所需的行为是很棘手的,因为很难将真正的取消选择与 UITableView 认为我因选择另一个单元格而取消选择的取消选择区分开来!
希望有人能帮忙!
谢谢,
缺口。
如果您正在为 iOS5.0+ 开发应用程序,以下属性应该可以正常工作
self.tableView.allowsMultipleSelection = YES;
最好的方法是对每个选定的行进行复选标记。
您可以通过将所选 UITableViewCell 实例上的 accessoryType 设置为 UITableViewCelAccessoryCheckmark 来做到这一点。
要取消选择该行,请将其设置回 UITableViewCellAccessoryNone。
要枚举选择了哪些单元格/行(例如,单击按钮时),只需遍历表格的单元格以查找 UITableViewCellAccessoryCheckmark。或者,在“did select”委托方法中的表视图委托中管理一些 NSSet 等。
使用以下代码设置单元配件类型:
- (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
我还没有尝试过代码,但它一直在我脑海中浮现,我知道我需要它的那一天会到来。
我从 iOS5向后移植allowsMultipleSelectionDuringEditing
到旧版 iOS。allowsMultipleSelection
你可以在https://github.com/ud7/UDTableView-allowsMultipleSelection分叉它
它是替代品,您唯一需要做的就是将 UITableView 更改为 UDTableView(在代码或界面构建器中)
从HIG:
当用户选择列表项时,表格视图会提供反馈。具体来说,当可以选择一个项目时,包含该项目的行会在用户选择它时短暂突出显示,以表明已收到选择。然后,立即采取行动:要么显示一个新视图,要么该行显示一个复选标记以指示该项目已被选中。该行永远不会保持突出显示,因为表视图不会显示持久的选定状态。
您需要滚动自己的多选样式,或者使用邮件之类的东西,或者使用单元格上的复选标记附件。
多选的家伙,你只需要
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;
}
我正在寻找同样的问题,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;
}
如果您尝试执行 Mail 的多选(例如删除邮件)之类的操作,那么您可能必须自己管理所有选择。多行选择不是 iPhone 的标准功能。Mail 通过使用复选标记来指示已选择哪些行来解决此问题。
根据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;
}
}
然后添加您的排列或您希望如何存储选择的数据。
注意:这在 iOS 4+ 中不起作用。这是一个私有的、未记录的常量。不要使用它。
如果您不打算将应用提交到 App Store,您可以通过在 UITableViewController 委托中实现以下方法来调用多行编辑模式:
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return 3; // Undocumented constant
}
使用 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;
}