我已经实现了一个viewController
,其中包含tableView
,其中显示了从登录Facebook或Twitter或google Plus获取的用户数据(firstName,lastName,birthday ..)。我已经制作了三个自定义单元格:firstNameTableViewCell
,lastNameTableViewCell
,birthdayTableViewCell
:所有这三个单元格都包含一个标签和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];
}
}
答案 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];