Ios textfield.tableview上的text显示值为null

Ios textfield.tableview上的text显示值为null,ios,Ios,我使用下面的代码向每个tableview单元格添加textfield - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger row=[indexPath row]; static NSString *SimpleTableIdentifier1 = @"CellTableIdentifi

我使用下面的代码向每个tableview单元格添加textfield

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

    NSInteger row=[indexPath row];
    static NSString *SimpleTableIdentifier1 = @"CellTableIdentifier";
    //if I change the code to [NSString *SimpleTableIdentifier1 =NSString stringWithFormat:@"CellTableIdentifier%d",row]; everything is fine         


    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier1 ];

    if  (cell == nil){

        CGRect cellframe=CGRectMake(0, 0, 200, 60);
        cell=[[[UITableViewCell alloc] initWithFrame: cellframe  reuseIdentifier:SimpleTableIdentifier1] autorelease];
        UITextField * textfieldCell =[[UITextField alloc]init];
        textfieldCell.frame = CGRectMake(100.0f,20.0f,60.0f,26.0f) ;
        [textfieldCell setDelegate:self];
        [textfieldCell setTag:40000+row];//add row value here for later use, 
        [cell.contentView addSubview:textfieldCell];
        [textfieldCell release];

    }
    UITextField *textfieldCell ;

    textfieldCell =(UITextField*)[cell.contentView viewWithTag:40000+row];
    textfieldCell.text=[ NSMutableString  stringWithString:@"aaa1"];
    DebugLog(@"---------%@",textfieldCell.text);

    return cell;


}
textfieldCell.text有时显示空值,而不是我的期望值“aaa1”

这意味着代码行位于:

textfieldCell =(UITextField*)[cell.contentView viewWithTag:40000+row];
有时返回nil,尝试修复此混乱的结果,但失败

欢迎您发表评论

此dequeueReusableCellWithIdentifier

返回非nil单元格

如果现有单元格可用,此方法将其出列,或者使用以前注册的类或nib文件创建新单元格。如果没有可重用的单元格,并且您没有注册类或nib文件,则此方法返回nil

它可能有一个带有不同标记的文本字段,导致

 UITextField *textfieldCell ;
这两行

// here rhs may be nil
textfieldCell =(UITextField*)[cell.contentView viewWithTag:40000+row];
textfieldCell.text=[ NSMutableString  stringWithString:@"aaa1"];
对nil textfield没有任何影响,同样令人震惊的是,您仍然在这里使用MRC手动参考计数

[textfieldCell release];

请更新到ARC自动引用计数,这将消除您对内存管理问题的担忧

出于性能原因,UITableView使用动态单元格池。只有当前显示在屏幕上的单元格才是真正处于活动状态的单元格。任何从视图中滚出的单元格都将从视图中删除,并返回到由SimpleTableIdentifier1标识的池中 方法dequeueReusableCell从池中检索一个单元格(如果有),或者在类或XIB已注册的情况下创建一个单元格,否则返回nil。 这样做的结果是,您的代码可能会返回先前创建的单元格,该单元格先前已用于其他行。该单元格中存在的标记很可能与其他行相关。这一切都取决于屏幕上和屏幕下的行滚动。 将标识符更改为CellTableIdentifier%行会导致每个单元格从其自己的池中分配,并避免此冲突。然而,这将完全违背细胞重复使用的目的。 由于使用标记只是在单元格中定位文本字段,因此不需要使标记在表格的所有单元格中都是唯一的。只需使用一个简单的常量,即4000而不是4000+行。viewWithTag将返回层次结构中匹配的视图,您仍将从内容视图开始。
话虽如此,代码的结构确实不理想。更好的方法是将单元格定义为类、故事板中的布局,并作为类的成员直接访问文本字段。

谢谢您的快速回复,但看起来您再次描述了问题而不是解决方案,ARC不是问题ARC是给您的提示与问题无关,如上所述,在4000+行中嵌入行时,deqeuing行可能会返回一个带有不同标记的texfield,请注意,表单元格是出列的[textfieldCell setTag:40000+行];是为了以后点击文本字段通知,不同的标签表示不同textfield@arachide如果cell==nil将永远不会点击删除它,并首先从旧textfield中清除该单元格(如果存在),然后添加新单元格,另外,我建议使用原型cell/xib,而不是在cellfoRow中添加元素,并将它们链接为outlet,并将tagI更改代码设置为NSString*SimpleTableIdentifier1=NSString stringWithFormat:@CellTableIdentifier%d,row];看起来一切正常,但不知道以后是否有冲突UITableViewCell*cell=[UITableViewCell][textField superview];划船是更好的解决办法
[textfieldCell release];