本文档版权归NickTang所有,没有本人书面或电子邮件允许,不许转载,摘录,发表。多谢!
我们在使用tableview的时候,常常会用到删除功能,但是在5.0以前的版本中,我们没有办法一次通过界面删除多行,在iOS5中,这个功能加入近来了。
我们先看一下原先的删除界面的样式
下面是新增加的,可以选择多行的样式。
我们开始分析这个工程的代码。
首先,如果你是下载的2011/10/12的版本的话,工程中会有一个bug,当tableview处于不是编辑状态的时候,你会发现,点中table中的一行,程序没有反映,请打开MainWindow.xib文件。如下图所示:
右键点击MyViewController,在菜单中选择New Referencing Outlet,拉到MyTableViewController上,在弹出的面板上选择viewController.然后保存,编译,这样,你就可以看到在选择一行的时候,有一个新的view出现。
因此,这也是我们从这个例子代码中学到的第一点,
你会发现,MyViewController,EditButton等四个button都是和上面的Window是独立的,不从属于任何View Controller,但是它们又链接到MyTableViewController中的某个变量,这样的话,我们就可以通过xib的方式初始化这些界面相关的东西。你可以试着添加一些其他的元素,这些元素在xib被load近来的时候被初始化。
AppDelegate类没有什么好说的,请参考我原先的分析。
MyTableViewController是我们需要重点分析的:
我们看一下如何使得一个table view支持多行选择,
1.在viewDidLoad函数中:
self.tableView.allowsMultipleSelectionDuringEditing = YES;
这个allowsMultipleSelectionDuringEditing属性缺省是NO;当为NO的时候,就是老式的删除方式。
2.在函数
- (IBAction)editAction:(id)sender
中[self.tableViewsetEditing:YESanimated:YES];
上面的这句话,使得table view开始可编辑状态。不论新的方式还是老的方式,都是这句话。
3.函数
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
在取消选择某一行的时候调用。所以在判断tableview如果是在编辑状态的时候,调用
NSArray *selectedRows = [self.tableViewindexPathsForSelectedRows];
来得到所以已选择的行,然后利用这个数组中数据的个数来更新导航栏上右button上的文本。
4.函数
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
在选中某一行的时候调用
首先判断是否table view在编辑状态,如果是,就更新导航栏的右button,如果不是,就导航到下一个view。
5.函数
- (IBAction)addAction:(id)sender
在导航栏右button是一个加号的时候被调用,这个时候,增加一行,并且调用
[self.tableViewscrollToRowAtIndexPath:[NSIndexPathindexPathForRow:(self.dataArray.count - 1) inSection:0]atScrollPosition:UITableViewScrollPositionBottomanimated:YES];
使得table view滚动到最后一行。
最后我增加一下老式的删除方式,
首先我们不能调用
self.tableView.allowsMultipleSelectionDuringEditing = YES;
或者把这个变量设置为NO;
其次增加一个函数如下
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle ==UITableViewCellEditingStyleDelete) {
[self.dataArrayremoveObjectAtIndex:[indexPathrow]];
//[myTable reloadData];
[self.tableViewdeleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];
}
}
其他的代码就不再解释了,都是很普通的逻辑和函数调用,注意,这个多选的模式只能在iOS5中使用。