想对UITableViewController进行编辑,得加入编辑按钮,在viewDidLoad中加入下代码
self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.navigationItem.rightBarButtonItem.title = GROUPMANAGER;
编辑按钮切换功能时,会调用SetEdit事件,可以重写,如下
-(void) setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; self.navigationItem.leftBarButtonItem.enabled = !editing; [self.tableView beginUpdates]; NSUInteger count = [groupArray count]; NSArray *groupInsertIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]]; // Add or remove the Add row as appropriate. UITableViewRowAnimation animationStyle = UITableViewRowAnimationNone; if (editing) { self.navigationItem.rightBarButtonItem.title = DoString; if (animated) { animationStyle = UITableViewRowAnimationFade; } [self.tableView insertRowsAtIndexPaths:groupInsertIndexPath withRowAnimation:animationStyle]; } else { for (EntityGroup *group in modifyGroupIDArray) { SqliteOperation *sqlOperation = [[SqliteOperation alloc] init]; [sqlOperation ModifyGroupName:group]; [sqlOperation release]; } [modifyGroupIDArray removeAllObjects]; self.navigationItem.rightBarButtonItem.title = GROUPMANAGER; [self.tableView deleteRowsAtIndexPaths:groupInsertIndexPath withRowAnimation:UITableViewRowAnimationFade]; } [self.tableView endUpdates]; }
以下代理方法,设置表中,哪些行,可以进入编辑状态
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
if (indexPath.section == 0) {
return YES;
}
else {
return NO;
}
}
以下代理方法,设置在编辑状态下,哪些行是删除功能,哪些行是添加功能
-(UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == groupArray.count) {
return UITableViewCellEditingStyleInsert;
}
else {
return UITableViewCellEditingStyleDelete;
}
}
以下代理方法,表示执行删除或者添加功能
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
EntityGroup *group = [groupArray objectAtIndex:indexPath.row];
SqliteOperation *sqlOperation = [[SqliteOperation alloc] init];
[sqlOperation DeleteGroup:group.GroupID];
[sqlOperation release];
[(NSMutableArray*)groupArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; }
else if (editingStyle == UITableViewCellEditingStyleInsert) {
[self addGroup];
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
而修改功能,则需要自定义一个UITableViewCell,其中一个包括UITextField,用于编辑内容
修改内容时完成时,UITextField会执行以下代理方法,前提是将当前的UITextField的delegate设置为代理方法所在类,一般是self
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
可以将UITextField的tag设置为表的行号,这样就根本tag找到相应的数据源,而修改数据源数据
可以直接在此保存!可以将UITextField,
因此在设置表行的代理方法中,需要这样设置
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UIImage *image;
static NSString *EditCellIdentifier =@"EditCell";
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:EditCellIdentifier];
if ( cell== nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"ConferencingGroupCell" owner:self options:nil] objectAtIndex:0];
}
EntityGroup *group = [groupArray objectAtIndex:indexPath.row];
//自定义cell ConferencingGroupCell
ConferencingGroupCell *editCell = (ConferencingGroupCell*)cell;
editCell.txtEdit.text = group.GroupName;
editCell.txtEdit.delegate = self;
editCell.lblDiscription.text = [NSString stringWithFormat:@"人数:%d",group.GroupNmuber];
editCell.txtEdit.tag = indexPath.row;
editCell.delegate = self;
editCell.accessoryType = group.isSelected ? UITableViewCellAccessoryCheckmark:UITableViewCellAccessoryNone;
return cell;
}
在自定义的cell中需要写如下代码,来达到完成编辑时的操作
//表示在编辑或者非编辑状态下,设置UITextField是否可用
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
// The user can only edit the text field when in editing mode.
[super setEditing:editing animated:animated];
txtEdit.enabled = editing;
}
//表示在编辑状态下,出现删除按钮时的代理方法
- (void)willTransitionToState:(UITableViewCellStateMask)state {
[super willTransitionToState:state];
if (state & UITableViewCellStateEditingMask) {
lblDiscription.hidden = YES;
btnDetail.hidden = YES;
}
}
//表示编辑状态下,删除按钮消失时的代理方法
- (void)didTransitionToState:(UITableViewCellStateMask)state {
[super didTransitionToState:state];
if (!(state & UITableViewCellStateEditingMask)) {
lblDiscription.hidden = NO;
btnDetail.hidden = NO;
}
}
以上一定注意
直接在表中,添加一行时,要求能看到效果时,必须先在数据源中添加数据,如下
NSArray *localIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:contactArray.count inSection:1]];
[contactArray addObject:contact];
[tableView insertRowsAtIndexPaths:localIndexPath withRowAnimation:UITableViewRowAnimationFade];
直接在表中,删除一行,并且能看到删除效果时,也必须先在数据源中删除相应的数据,如下
NSArray *groupIndexPath = [NSArray arrayWithObject:indexPath];
[(NSMutableArray*)group.ContactArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:groupIndexPath withRowAnimation:UITableViewRowAnimationFade];