UITableView有一個強大的編輯模式(editing mode),在編輯模式中可實現刪除,插入,多選,排序等功能。使用的方法多很簡單。以下介紹刪除和排序功能:
首先查看SDK提供的API:
// Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath // Moving/reordering // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPat // Data manipulation - reorder / moving support - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
創建UITableView后簡單的實現以上4個代理就可以實現刪除和排序的功能。當然,你必須實現 UItableViewDataSource 穿件Cell的兩個代理。以下是完整代碼:

@interface ViewController () <UITableViewDataSource, UITableViewDelegate> { UITableView *_tableView; } @end @implementation ViewController - (void)dealloc { _tableView.delegate = nil; _tableView.dataSource = nil; [_tableView release],_tableView = nil; [super dealloc]; } - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *navItem = [[UIBarButtonItem alloc]initWithTitle:@"Edit" style:UIBarButtonSystemItemEdit target:self action:@selector(editBUttonOnClicked)]; self.navigationItem.rightBarButtonItem = navItem; [navItem release]; _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 44) style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; } - (void)editBUttonOnClicked { [_tableView setEditing:!_tableView.editing animated:YES]; if (!_tableView.editing) { UIBarButtonItem *barButtonItem = self.navigationItem.rightBarButtonItem; barButtonItem.title = @"Edit"; }else { UIBarButtonItem *barButtonItem = self.navigationItem.rightBarButtonItem; barButtonItem.title = @"Done"; } } #pragma mark - UItableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 10; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifity = @"cellIdentifity"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifity]; if (!cell) { cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifity]autorelease]; } cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row]; return cell; } // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } // Moving/reordering // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPat { } // Data manipulation - reorder / moving support // - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath { //修改對應的數據源 // id object=[[dataSource objectAtIndex:[fromIndexPath row]] retain]; // [dataSource removeObjectAtIndex:[fromIndexPath row]]; // [dataSource insertObject:object atIndex:[toIndexPath row]]; // [object release]; }
說明:
1.必須實現 moveRowAtIndexPath 這個代理,才會出現可以拖拽的按鈕;
2.根據需要設置cell是否支持排序和刪除功能。