打开 Xcode,去往 File\New\Project… 并选择 Master-Detail Application ,如下所示:
将项目命名为 SwipeableCell 并填好你自己的 Organization Name 和 Company Identifier 。选择 iPhone 为目标设备并确保 Use Core Data 没有被选中,如所示:
对于这样的概念项目的证明,最好保证数据模型尽量简单。
打开 MasterViewController.m 并找到 viewDidLoad 。将默认设置 Navigation Bar Items 的方法替换为如下实现:
- (void)viewDidLoad {
[super viewDidLoad];
//1
_objects = [NSMutableArray array];
//2
NSInteger numberOfItems = 30;
for (NSInteger i = 1; i <= numberOfItems; i++) {
NSString *item = [NSString stringWithFormat:@"Item #%d", i];
[_objects addObject:item];
}
}
这个方法做了两件事:
这一行创建并初始化一个 NSMutableArray 实例,以后就可以添加对象到它里面了。如果数组没有被初始化,那不论调用 addObject: 多少次,那些对象都不会被存储起来。
这个循环添加了一些字符串到 _objects 数组,应用运行时,这些字符串将用于显示在 Table View 里。可以修改 numberOfItems 的值,以存储适合更多或更少的字符串。
下一步。找到 tableView:cellForRowAtIndexPath: 并替换其实现为:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSString *item = _objects[indexPath.row];
cell.textLabel.text = item;
return cell;
}
原本 tableView:cellForRowAtIndexPath: 的样板使用日期字符串作为简单数据;而你的实现使用你的数组里的 NSString 对象去填充 UITableViewCell 的 textLabel 。
往下滚动到 tableView:canEditRowAtIndexPath: ;会看到这个方法已经设置为返回 YES,也就是说, Table View 的每一行都支持编辑。
就在这个方法下边,tableView:commitEditingStyle:forRowAtIndexPath: 处理对象的删除。然而,因为还不能添加任何东西到这个应用里,那就先稍微修改它一下以适应需求。
用下面的代码替换 tableView:commitEditingStyle:forRowAtIndexPath: :
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_objects removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else {
NSLog(@"Unhandled editing style! %d", editingStyle);
}
}
当用户删除某行时,就用传入的 Index 将那一行的对象从后面的数组中移除,并告知 Table View 它需要移除同一个 indexPath 所表示的那一行 Cell,一确保模型和视图的匹配。
应用只允许“delete”这一种编辑方式,但在 else 分支里用 log 记录没有在处理什么也不错。如果有某个诡异的事情发生,将会在控制台得到一个提示消息,这比方法静悄悄地返回要好。
最后,还有一些清理要做。依然在 MasterViewController.m 里,删除 insertNewObject。这个方法现在不正确,因为插入已经不再被支持了。
编译并运行应用;会看到一个简单列表,如下所示:
滑动某一行到左边,就会看到一个 “Delete” 按钮