我使用以下代码向每个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,请尝试解决此混淆结果,但失败
欢迎评论
答案 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将返回匹配的层次结构中的视图,无论如何,您都是从内容视图开始的。
说了这么多,您的代码结构实际上并不理想。更好的方法是将您的单元格定义为一个类,在情节提要中进行布局,并作为该类的成员直接访问文本字段。