如何在iOS中的tableView中编辑单元格?

时间:2015-06-07 11:13:30

标签: ios objective-c uitableview

我已经实现了一个viewController,其中包含tableView,其中显示了从登录Facebook或Twitter或google Plus获取的用户数据(firstName,lastName,birthday ..)。我已经制作了三个自定义单元格:firstNameTableViewCelllastNameTableViewCellbirthdayTableViewCell:所有这三个单元格都包含一个标签和textfield。我希望当用户触摸相应的单元格时,将能够改变他的数据。

从技术上讲,我使用了tableView的委托方法:cellForRowAtIndexPath& didSelectRowAtIndexPath但我没有我想要的东西:当我打开界面时:标签消失了,当我触摸相应的单元格时,没有任何变化。 这是我的代码:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

switch (indexPath.row)
{
    case 0 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"genderCell"];
        genderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];

        cell.maleImageView = [cell  showGender:self.gender];
        cell.femaleImageView =[cell  showGender:self.gender];

        return cell ;

        break;
    }

    case 1 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"firstNameCell"];
        firstNameTableViewCell  *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];
        cell.firstNameLabel.text = [NSString stringWithFormat:@"%@",self.firstName];
        cell.firstNameTextField.hidden =YES ;
        return cell;
        break;
    }

    case 2 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"lastNameCell"];
        lastNameTableViewCell  *cell= [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];
        cell.lastNameLabel.text =  [NSString stringWithFormat:@"%@",self.lastName];

        cell.lastNameTextField.hidden = YES ;
        return cell;
        break;
    }


    case 3 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"BirthDayCell"];
        birthDayTableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];
        cell.birthDaylabel.text = [NSString stringWithFormat:@"%@",self.birthDay];
        cell.birthDayTextField.hidden = YES ;
        return cell;

        break;
    }


    case 4 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"heightCell"];
        heightTableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];
        cell.heightUnityLabel.text = [NSString stringWithFormat:@"%@",self.heightUnity];
        self.height = [cell.heightTextField.text   floatValue];

        return cell;
        break;
    }


    case 5 : {

        NSString *cellIdentifier = [[NSString alloc] initWithFormat:@"weightCell"];
        weightTableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[self.tableUserData objectAtIndex:indexPath.row]];


        cell.weightUnityLabel.text = [NSString  stringWithFormat:@"%@",self.weightUnity];
        self.weight = [cell.weightTextField.text   floatValue];

        return cell;
        break;
    }


    default:
        break ;
}

return nil ;
     }


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%ld",indexPath.row);

if (indexPath.row == 1) {

    firstNameTableViewCell *cell = [firstNameTableViewCell new];
    cell.firstNameLabel.hidden = YES ;
    cell.firstNameTextField.hidden = NO ;
    cell.firstNameTextField.text = cell.firstNameLabel.text ;
    [self.userDataTableView  reloadData];
}

else   if (indexPath.row == 2) {

    lastNameTableViewCell *cell = [lastNameTableViewCell new];
    cell.lastNameLabel.hidden = YES ;
    cell.lastNameTextField.hidden = NO ;
    cell.lastNameTextField.text = cell.lastNameLabel.text ;
    [self.userDataTableView  reloadData];
}
else   if (indexPath.row == 3) {

    birthDayTableViewCell *cell = [birthDayTableViewCell new];
    cell.birthDaylabel.hidden = YES ;
    cell.birthDayTextField.hidden = NO ;
    cell.birthDayTextField.text = cell.birthDaylabel.text ;
    [self.userDataTableView  reloadData];
}
    }

1 个答案:

答案 0 :(得分:0)

内部:

-(void)tableView:tableView didSelectRowAtIndexPath:indexPath

如果您只是使用indexPath返回单元格,那就更好了:

firstNameTableViewCell *cell = (firstNameTableViewCell *)[tableView cellForRowAtIndexPath:(NSIndexPath)];
..
cell.firstNameTextField.hidden = NO ;
cell.firstNameTextField.text = cell.firstNameLabel.text;

// but do not reload the table yet.. 

而是将cell.firstNameTextField作为第一响应者并让用户输入必要的数据..

[cell.firstNameTextField becomeFirstResponder];

如果用户已完成编辑并且您有数据库,请在DONE上更新您的数据库,然后更新您的表dataSource(self.tableUserData),然后才需要[self.userDataTableView reloadData];,我认为您不需要真的想为这个单一的编辑重新加载整个表,[self.userDataTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimation)]只重新加载目标indexPath更适合那个..

-reloadData表示' 根据您的阵列数据源重新加载表格中的所有内容'。意思是在内部设置值:

-(void)tableView:tableView willDisplayingCell:cell forRowAtIndexPath:indexPath

-(UITableViewCell *)tableView:tableView cellForRowAtIndexPath:indexPath

例如: cell.firstNameLabel.text = [NSString stringWithFormat:@"%@",self.firstName]; cell.lastNameTextField.hidden = YES ;

将刷新并按原样设置......

修改

另外我注意到你在dequeueReusableCellWithIdentifier之后没有分配你的单元格(我想知道为什么你的应用程序因为它没有崩溃),无论如何它对内存有好处reuseCells喜欢:

firstNameTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil)
     cell = [[firstNameTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];