我有一个异构的tableView,整个部分由UITableViewCells组成,每个人的contetView都有一个UITextField控件。问题是我在滚动时看到文本字段中写入的文本混合在一起。
我在这个问题之前已经多次看过了,尽管它被弃用了,但我通过为每种类型的单元格分配不同的cellIdentifier来解决这个问题。
现在有什么不同,我正在动态创建单元格,并且根据服务器的答案,表格的部分可能有零个或多个自定义单元格(具有textField的单元格)。
现在,有趣的是看到textfiled的属性(如占位符)在整个滚动条中都是持久的,但我写的文本根本不是持久的,文本改变了它的位置......
我有一段视频here,所以你可以看到我的意思。
我使用的代码如下:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
NSString *varCellID = [NSString stringWithFormat:@"%i_VarCellID", (indexPath.row + 7891)];
if (indexPath.section == 0) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[self configureCellViews:cell indexPath:indexPath];
}
[self configureCellContent:cell indexPath:indexPath];
return cell;
}
else if (indexPath.section == 1) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[self configureCellViews:cell indexPath:indexPath];
}
[self configureCellContent:cell indexPath:indexPath];
return cell;
}
else {
UITableViewCell *varCell = [tableView dequeueReusableCellWithIdentifier:varCellID];
if (varCell == nil) {
varCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:varCellID] autorelease];
varCell.selectionStyle = UITableViewCellSelectionStyleNone;
[self configureCellViews:varCell indexPath:indexPath];
}
[self configureCellContent:varCell indexPath:indexPath];
return varCell;
}
}
我知道它不优雅,但之前已经开过话了。除了dinamically创建的单元格标识符,这是我(绝望)尝试在每个textField上保留单个内容之一。
以下是我创建单元格视图和内容的方法:
#pragma mark -
#pragma mark ConfigureCellcontent
- (void)configureCellViews:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
NSArray *aSection = [sections objectAtIndex:indexPath.section];
NSDictionary *aField;
int varformatid;
if (indexPath.section == 0) {
cell.detailTextLabel.textAlignment = UITextAlignmentLeft;
}
else if (indexPath.section == 1) {
cell.detailTextLabel.textAlignment = UITextAlignmentLeft;
}
else {
aField = [aSection objectAtIndex:indexPath.row];
varformatid = [[aField valueForKey:@"varformatid"] intValue];
NSArray *aSection = [sections objectAtIndex:indexPath.section];
NSLog(@"format id %@", [[aSection objectAtIndex:0] valueForKey:@"varname"]);
fieldLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 7, 100, 30)];
fieldLabel.tag = 1234;
fieldLabel.textAlignment = UITextAlignmentLeft;
fieldLabel.font = [UIFont boldSystemFontOfSize:14];
fieldLabel.adjustsFontSizeToFitWidth = YES;
[cell.contentView addSubview:fieldLabel];
theTextField = [[UITextField alloc] initWithFrame:CGRectMake(130, 12, 170, 30)];
theTextField.textColor = kAnswersTextColor;
theTextField.returnKeyType = UIReturnKeyDone;
theTextField.tag = indexPath.row + 101;
theTextField.adjustsFontSizeToFitWidth = YES;
theTextField.delegate = self;
if(varformatid == 6 || varformatid == 7 || varformatid == 8) {
// use number pad input
theTextField.keyboardType = UIKeyboardTypeNumberPad;
[cell addSubview: theTextField];
[theTextField release];
}
else if(varformatid == 4) {
// use date
}
else if(varformatid == 17 || varformatid == 18) {
// use pull down, elements of pull down are in XML
}
else if(varformatid == 20) {
theSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(120, 8, 100, 30)];
theSwitch.selected = YES;
[cell.contentView addSubview:theSwitch];
}
else {
// use input string
[cell addSubview: theTextField];
[theTextField release];
}
}
}
- (void)configureCellContent:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath {
NSArray *aSection = [sections objectAtIndex:indexPath.section];
NSString *aField;
if (indexPath.section == 0) {
aField = [[aSection objectAtIndex:0] valueForKey:@"SetDate"];
cell.textLabel.text = @"Set Date";
cell.detailTextLabel.text = aField;
}
else if (indexPath.section == 1) {
aField = [[aSection objectAtIndex:0] valueForKey:@"SetType"];
cell.textLabel.text = @"Set Type";
cell.detailTextLabel.text = aField;
}
else {
aField = [[aSection objectAtIndex:indexPath.row] valueForKey:@"varname"];
if ([[[aSection objectAtIndex:indexPath.row] valueForKey:@"varrequired"] isEqualToString:@"yes"]) {
[(UITextField *)[cell viewWithTag:indexPath.row + 101] setPlaceholder: @"Required"];
}
else [(UITextField *)[cell viewWithTag:indexPath.row + 101] setPlaceholder: @"Optional"];
[(UILabel *)[cell.contentView viewWithTag:1234] setText: aField];
}
}
最后,我请求你的帮助,找到至少一种更好的方法。提前谢谢。
答案 0 :(得分:2)
您的configureCellContent似乎已损坏。因此,您要么没有使用键入的文本更新内部数据结构(您可能希望在每次文本更改时都这样做),或者您错过了在configureCellViews中填写正确的值。
旁注:你不应该在顶部出两个单元格。只是出列一个正确的!即将其放入 if 部分。
答案 1 :(得分:2)
我之前遇到过这个。我相信这是因为UITableViewCells在不可见时被释放以减少内存消耗。当您向上滚动时,您将获得该单元格的新出列实例。
您需要将某个单元格的状态保存到某个位置,以便在它返回视图时重新初始化它。保存完全取决于您 - 当您的UITextField失去焦点,或者以任何方式更改字段时。
答案 2 :(得分:1)
我不知道这是否是您参加的解决方案,但您可以修改CellIdentifier并使其独一无二。
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d",indexPath.row];
答案 3 :(得分:0)
NSString * CellIdentifier = [NSString stringWithFormat:@“Cell%d”,indexPath.row]; 代替静态NSString * CellIdentifier = @“Cell”;
是在快速滚动的情况下混合行的解决方案。