可编辑的TableView

    技术2022-05-20  60

    在编写简单的导航控制器基础上,让TableView的条目是可编辑的。这里示例将实现对条目的排序,删除等类似。实现的效果:    在编写简单的导航控制器基础上做如下修改。 首先要将存储数据的NSArray改为NSMutableArray,因为前者是不可变的。在头文件中:

    @interface RootViewController : UITableViewController <UITableViewDelegate,UITableViewDataSource>{      NSMutableArray *dataItems;

    在m文件中:

    dataItems= [[NSMutableArray alloc] initWithObjects:@"张三",@"李四",nil];

    然后,增加导航条右侧的按钮。先写出点击按钮的函数:

    -(IBAction)toggleMove{      [self.tableView setEditing:!self.tableView.editing animated:YES];  }

    下面,声明按钮并关联上述函数:

    - (void)viewDidLoad {      dataItems= [[NSMutableArray alloc] initWithObjects:@"张三",@"李四",nil];      self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"移动"                                                                              style:UIBarButtonItemStyleBordered                                                                             target:self                                                                             action:@selector(toggleMove)];      [super viewDidLoad];  }

    其实就是增加一句话。 添加有关显示风格等的函数:

    -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{      return UITableViewCellEditingStyleNone;  } -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{      return YES;  }

    其中,后者(canMoveRowAtIndexPath)如果不写,将是删除而不是移动。 在原有生成表条目的函数中增加一句话,用于显示右侧的控件:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {      static NSString *CellIdentifier = @"Cell";      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];      if (cell == nil) {          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];           cell.showsReorderControl=YES;      }

    下面是最关键的函数,在移动表条目时回调的函数:

    -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *) fromIndexPath       toIndexPath:(NSIndexPath *)toIndexPath{      id object=[[dataItems objectAtIndex:[fromIndexPath row]] retain];      [dataItems removeObjectAtIndex:[fromIndexPath row]];      [dataItems insertObject:object atIndex:[toIndexPath row]];      [object release];  }

    这样就可以实现上述的效果了,不过会出现这样的警告日志:

    2010-10-13 22:42:47.220 NavTest[77449:207] WARNING: Using legacy cell layout due to delegate implementation of tableView:accessoryTypeForRowWithIndexPath: in <RootViewController: 0x5c04150>.  Please remove your implementation of this method and set the cell properties accessoryType and/or editingAccessoryType to move to the new cell layout behavior.  This method will no longer be called in a future release.

    因为accessoryTypeForRowWithIndexPath函数已经不建议使用了,要替换成:

    // Customize the appearance of table view cells.  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {      static NSString *CellIdentifier = @"Cell";      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];      if (cell == nil) {          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];          cell.showsReorderControl=YES;          cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;     }      NSUInteger row=[indexPath row];      cell.textLabel.text=[dataItems objectAtIndex:row];     return cell;  }

    同时删除tableView:accessoryTypeForRowWithIndexPath函数。这个问题不是编辑TableView时出现的,在前面写的编写简单的导航控制器中就开始有这个问题。


    最新回复(0)