10编辑UITableView

编辑UITableView
编辑模式 Editing Mode
UITableView有一个名为editing的属性,将某个UITableView对象的editing属性设置为YES时,该对象会进入编辑模式。在编辑模式下,用户可以管理UITableView对象中的表格行,例如改变行的排列顺序、增加行或者删除行。但是编辑模式没有提供修改行的内容的功能。
使用NSBundle类可以载入指定的XIB文件。该类是“应用程序包”和“应用程序包所包含的可执行文件”之间的接口。通过该类,应用可以访问某个程序包中的文件。向该类发送mainBundle消息可以得到一个指向特定NSBundle实例的指针,该实例是应用在启动时创建的。
[[NSBundle mainBundle] loadNibName:@“HeaderView” owner:self options:nil];

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

-(void)loadView{

    [super loadView];

    if ([self nibName]) {

        [[NSBundle mainBundle] loadNibNamed:[self nibName] owner:self options:nil];

    } else {

        NSString *className = NSStringFromClass([self class]);

        NSString *nibPath = [[NSBundle mainBundle] pathForResource:className ofType:@"nib"];

        if ([[NSFileManager defaultManager] fileExistsAtPath:nibPath]) {

            [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil];

        } else {

            UIView *view = [[UIView alloc] initWithFrame:CGRectZero];

            [self setView:view];

           }    

}

}

增加行 cell.editingStyle = UITableViewCellEditingStyleInsert;

增加行时要确保UITableView对象当前显示的行数与数据源提供的行数相同。

1.创建新的实例加入数组或者数组抽象成的Store方法中

2.获取新创建的实例在allItems数组中的索引

3.将索引转成NSIndexPath(ip)

4.将新行插入UITableView对象

[[self tableView] insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationTop];

删除行 cell.editingStyle = UITableViewCellEditingStyleDelete;

红色圆圈是删除控件,但是删除前UITableView对象会先向数据源发送一条特定的消息,得到确认后才会有实际的操作。

1.从UITableView对象移除指定的UITableViewCell对象。

2.找到需要移除的UITableViewCell对象相应的实例,并将其从数组或者数组抽象出来的store中移除。

- (void)removeObjectIdenticalTo:(ObjectType)anObject;

为了删除对象出了可以使用- (void)removeObjectIdenticalTo:(ObjectType)anObject;这个方法外,还可以使用removeObject:。这两个方法的差别是,removeObject:方法会枚举数组,向每一个对象发送isEqual:消息。isEqual:的作用是判断当前对象和传入对象所包含的数据是否相等,返回YES或者NO。不同的类可以根据自身情况覆盖isEqual:并实现相应的逻辑。removeObjectIdenticalTo:方法不会比较对象所包含的数据,只会比较指向对象的指针。因此,该方法只会移除数组所保存的那些和传入对象指针完全相同的指针。

tableView: commitEditingStyle: forRowAtIndexPath:该方法是UITableViewDataSource协议所声明的方法之一(UITableView对象会向ViewController控制器对象发送这个消息。注意:UITableView对象的数据源是ViewController对象,而不是负责保存数据的Store)。

三个传入的参数:

1.发送该消息的UITableView对象。

2.UITableViewCellEditingStyle类型的常数,删除表格行时,传入的是UITableViewCellEditingStyleDelete。

3.NSIndexPath对象,其中包含相应表格行所在的表格段索引和行索引。

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    //如果UITableView对象请求确认的是删除操作

if(editingStyle == UITableViewCellEditingStyleDelete) {

//获取数组中所有的实例对象,并根据indexPath row得到要删除的实例

//将实例从数组或者数组抽象成的Store中删除

//删除表格视图中的相应表格行(带动画效果)

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];

}}

移动行MovingRows

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

移动表格行不需要确认,UITableView对象会自动移动行,然后向数据源发送tableView: moveRowAtIndexPath: toIndexPath:。消息,报告相关的移动信息。因此只需要为数据源实现tableView: moveRowAtIndexPath: toIndexPath:方法,然后根据传入的移动信息更新数据即可。

1.判断起始和终点位置是否相等,相等则return

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

3.将得到的对象从数组中移除

4.根据新的索引位置,将得到的对象插回数组

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





posted @ 2015-10-14 14:36  captivity  阅读(87)  评论(0)    收藏  举报