如何自定义tableViewCell的向左滑动出现的按钮

2024-11-29 19:52:51
推荐回答(1个)
回答1:

 打开 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” 按钮