您的位置:首页 > 移动开发 > IOS开发

iOS5编程--官方例子代码研究--5.TableMultiSelect

2011-10-16 15:09 405 查看
本文档版权归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中使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: