首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》9.4 移动行

关灯直达底部

要改变UITableView对象所显示的行的排列位置,需要为数据源实现另一个源自UITableViewDataSource协议的方法:tableView:moveRowAtIndexPath:。

9.3节已介绍了删除表格行时需要向UITableView对象发送deleteRowsAtIndexPaths: withRowAnimation:消息,以执行删除操作。但是移动表格行不需要,UITableView对象会自动执行移动操作,然后向数据源发送tableView:moveRowAtIndexPath:toIndexPath:消息,报告相关的移动信息。因此只需要为数据源实现tableView:moveRowAtIndexPath: toIndexPath:方法,然后根据传入的移动信息更新数据即可。

在为数据源实现tableView:moveRowAtIndexPath:toIndexPath:前,需要先为BNRItemStore增加一个方法,使BNRItemStore对象能够改变某个BNRItems对象在allItems数组中的位置。在BNRItemStore.h中声明方法,代码如下:

- (void)moveItemAtIndex:(NSUInteger)fromIndex

toIndex:(NSUInteger)toIndex;

在BNRItemStore.m中实现该方法,代码如下:

- (void)moveItemAtIndex:(NSUInteger)fromIndex

toIndex:(NSUInteger)toIndex

{

if (fromIndex == toIndex) {

return;

}

// 得到要移动的对象的指针,以便稍后能将其插入新的位置

BNRItem *item = self.privateItems[fromIndex];

// 将item从allItems数组中移除

[self.privateItems removeObjectAtIndex:fromIndex];

//根据新的索引位置,将item插回allItems数组

[self.privateItems insertObject:item atIndex:toIndex];

}

接下来,在BNRItemsViewController.m中实现tableView:moveRowAtIndexPath: toIndexPath:,更新BNRItemStore对象,代码如下:

- (void)tableView:(UITableView *)tableView

moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath

toIndexPath:(NSIndexPath *)destinationIndexPath

{

[[BNRItemStore sharedStore] moveItemAtIndex:sourceIndexPath.row

toIndex:destinationIndexPath.row];

}

构建并运行应用。当UITableView对象处于编辑模式时,会在每个表格行的右侧显示一个换位控件(有三条横线的控件)。按住换位控件后拖动,可以将相应的表格行移动至新的位置(见图9-9)。

图9-9 移动中的某个表格行

UITableView对象的数据源只需要实现tableView:moveRowAtIndexPath: toIndexPath:,相应的UITableView对象就会显示换位控件。借助Objective-C的语言特性,UITableView对象可以在运行时检查其数据源是否实现了tableView: moveRowAtIndexPath:toIndexPath:。如果已实现,UITableView对象就会显示换位控件,反之则不会。