UITableView有一个名为editing的属性,如果将editing属性设置为YES,UITableView就会进入编辑模式。在编辑模式下,用户可以管理UITableView中的表格行,例如之前提到的添加、删除和移动等操作。但是编辑模式没有提供修改行的内容的功能。
首先需要更新界面,使用户可以将UITableView对象设置为编辑模式。本章是为UITableView对象的表头视图(headerview)增加一个按钮,然后通过点击按钮使UITableView对象进入或退出编辑模式。表头视图是指UITableView对象可以在其表格上方显示的特定视图,适合放置针对某个表格段或整张表格的标题和控件。表头视图可以是任意的UIView对象。
表头视图有两种,分别针对表格段和表格。类似地,还有表尾视图(footerview),也具有表格段和表格两种。
使用NSBundle类可以载入指定的XIB文件。该类是“应用程序包”和“应用程序包所包含的可执行文件”之间的接口。通过该类,应用可以访问某个程序包中的文件。向该类发送mainBundle消息可以得到指向主NSBundle对象的指针,该对象是应用在启动时创建的。
如果使用nib加载界面,系统会使用loadView自动加载关联好的nib文件,手动代码加载界面需要覆盖父类的loadView代码,并且自己写创建界面的方法。
如果XIB文件名和controller文件名不一样,无法自动调用loadView加载nib文件,需要自己手动加载。
而什么时候适合加载?建议按需要用到时候手动加载。这方法使用了一种名为延迟实例化(LazyInstantiation)的设计模式:只会在真正需要使用某个对象时再创建它。在某些情况下,这种设计模式可以显着减少内存占用。
调用loadNibNamed:owner:options:时,需要传入XIB文件的文件名。文件名不需要包含后缀,NSBundle会自行判断并处理。此外,这段代码将self作为owner实参(拥有者)传给了NSBundle对象,self替换占位符对象File'sOwner。
UIViewController默认已经实现了通过XIB文件载入视图的功能(函数loadView)。其实现原理和headerView方法的相同,代码也相似。唯一的差别是,UIViewController对象会在载入XIB文件后,将插座变量view关联至XIB文件中指定的UIView对象。
切换编辑模式
虽然可以直接通过设置UITableView对象的editing属性来切换编辑模式,但是UITableViewController也有一个从UIViewController继承而来的editing属性。当某个UITableViewController对象的editing属性发生变化时,UITableViewController对象会同步修改其UITableView对象的editing属性。
向某个UIViewController对象或UIViewController子类对象发送setEditing:animated:消息,可以设置该对象的editing属性(UITableViewController覆盖了UIViewController的setEditing:animated:方法)。
增删移行
//创建NSIndexPath对象,代表的位置是:第一个表格段,数据的index
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:dataIndexNumber inSection:0]; //将新行插入UITableView对象
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
之后需要更新dataSource新一行的数据源,不然会崩溃。这里需要重点指出,视图的责任是将模型对象中的数据呈现给用户,只更新视图而不更新模型对象就会发生数据不一致的错误。
removeObjectIdenticalTo:/removeObject:移除NSArray的数据。
这两个方法的差别是,removeObject:会枚举数组,向每一个对象发送isEqual:消息。isEqual:的作用是判断当前对象和传入对象所包含的数据是否相等(返回YES或NO)。不同的类可以根据自身情况覆盖isEqual:并实现相应的逻辑。以BNRItem为例,当两个BNRItem对象的valueInDollars相等时,可以认为这两个对象是相等的。
removeObjectIdenticalTo:方法不会比较对象所包含的数据,只会比较指向对象的指针。因此,该方法只会移除数组所保存的那些和传入对象指针完全相同的指针。
在编辑模式下,UITableViewCell对象可能会显示中间有个减号的红色圆圈。这个红色圆圈是删除控件(deletioncontrol),按下删除控件可以删除其所属的那个表格行。
- (void)tableView:(UITableView*)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath*)indexPath
{
//如果UITableView对象请求确认的是删除操作……
if(editingStyle == UITableViewCellEditingStyleDelete)
{
...//删除数据库
//还要删除表格视图中的相应表格行(带动画效果)
...//删除视图
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
//编辑模式下,移动是本有功能,会触发这个协议方法,随后请自行在返回处,更新相关数据。
- (void)moveItemAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex;
网友评论