tableview上的textfield.text显示值null

时间:2018-11-14 00:05:18

标签: ios

我使用以下代码向每个tableview单元格添加文本字段

- (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,请尝试解决此混淆结果,但失败

欢迎评论

2 个答案:

答案 0 :(得分:1)

dequeueReusableCellWithIdentifier

 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier1 ];

返回非零单元格Docs

  

如果一个现有的单元格可用,则此方法使该单元出队,或者使用您先前注册的类或nib文件创建一个新的单元格。如果没有可供重用的单元格,并且您没有注册类或nib文件,则此方法返回nil

可能具有一个带有不同标签的textField,结果为nil

 UITextField *textfieldCell ;

这两行

// here rhs may be nil
textfieldCell =(UITextField*)[cell.contentView viewWithTag:40000+row];
textfieldCell.text=[ NSMutableString  stringWithString:@"aaa1"];

对nil文本字段无效,这也令人震惊,您仍然在这里使用MRC(手动引用计数)

[textfieldCell release];

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

答案 1 :(得分:0)

出于性能原因,UITableView使用动态单元格池。实际处于活动状态的唯一单元格是当前在屏幕上显示的单元格。滚动到视图之外的所有单元格都将从视图中删除,并返回到由“ SimpleTableIdentifier1”标识的池中

如果一个池可用,则方法dequeueReusableCell从池中检索一个池,如果已经注册了一个类或XIB,则创建一个池,否则返回nil。

这样做的结果是您的代码可能返回先前创建的单元格,该单元格之前已用于其他某行。该单元格存在的标签很可能与其他行相关。这都取决于屏幕上和行外的行滚动。

将标识符更改为“ CellTableIdentifier”%row会导致从其自己的池中分配每个单元,并避免了这种冲突。但是,这将完全破坏重用细胞的目的。

由于您仅使用标记来查找单元格中的文本字段,因此无需使标记在表的所有单元格中唯一。只需使用一个简单的常量即。 4000不是4000 +行。 viewWithTag将返回匹配的层次结构中的视图,无论如何,您都是从内容视图开始的。

说了这么多,您的代码结构实际上并不理想。更好的方法是将您的单元格定义为一个类,在情节提要中进行布局,并作为该类的成员直接访问文本字段。