UITableViewController 编辑功能中的,添加,删除,修改

来源:互联网 发布:东华软件总部 编辑:程序博客网 时间:2024/05/16 07:07

想对UITableViewController进行编辑,得加入编辑按钮,在viewDidLoad中加入下代码

    self.navigationItem.rightBarButtonItem = self.editButtonItem;
    self.navigationItem.rightBarButtonItem.title = GROUPMANAGER;

编辑按钮切换功能时,会调用SetEdit事件,可以重写,如下

 

以下代理方法,设置表中,哪些行,可以进入编辑状态

 

// 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];

原创粉丝点击