10编辑UITableView
-(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对象就会显示换位控件,反之则不会。

浙公网安备 33010602011771号