Hii大家!
我在表格视图的每个单元格中都有一些文本字段,如下所示
如果我在文本字段中输入一些数据并再次向上和向下滚动视图,则文本字段中的数据将设置为null。为什么会发生这种情况,我该如何避免这种情况?
以下是我的细胞构建代码
static NSString *CellIdentifier = @"Cell";
CustomCellStudentData *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
switch(indexPath.section)
{
case 0:
switch (indexPath.row)
{
case 0:
{
tfText[0] = [[UITextField alloc] initWithFrame:CGRectMake(125,15, 170, 40)];
cell.accessoryView = tfText[0];
tfText[0].delegate = self;
tfText[0].text = @"";
tfText[0].placeholder = @"<Student Name>";
cell.primaryLabel.text = @"Student Name: ";
}
break;
case 1:
{
tfText[1] = [[UITextField alloc] initWithFrame:CGRectMake(125,15, 170, 40)];
cell.accessoryView = tfText[1];
tfText[1].delegate=self;
tfText[1].placeholder = @"<Student Age>";
cell.primaryLabel.text = @"Student Age: ";
}
break;
}
提前完成
答案 0 :(得分:1)
当单元格滚出窗口时,它可能会被释放,因此您必须将输入保存在某处并从单元构造方法中读取。
以一个文本字段为例,取一个单元格: 首先我在我的界面中声明一个NSString,并应用于UITextFieldDelegate协议:
@interface someInterface : UITableViewController
<UITextFieldDelegate>
{
NSString* contentOfTextField;
}
@property(nonatomic,retain) NSString* contentOfTextField;
@end
然后,在cellForRowAtIndex:
static NSString *CellIdentifier = @"Cell";
CustomCellStudentData *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
UITextField* field = [[UITextField alloc] initWithFrame:CGRectMake(125,15, 170, 40)];
field.delegate = self;
field.tag = 1;
field.text = self.contentOfTextField;
[cell addSubView:field];
[field release];
return cell;
最后,每次编辑时都应用它来更新contentOfTextField:
-(void)textFieldDidEndEditing:(UITextField*)textField
{
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath(/*the indexPath of your cell*/)];
UITextField* t = (UITextField*)[cell viewWithTag:1];
self.contentOfTextField = t.text;
}
答案 1 :(得分:1)
在用户写入时(在将自己设置为文本字段的委托时)保存数据,在cellForRow中检查是否保存了数据。如果是,请加载它。否则设置占位符。
答案 2 :(得分:0)
您必须保存在表格单元格中输入的数据,这样当您滚动表格视图时,它不会丢失。
希望它有所帮助.....
答案 3 :(得分:-1)
我也遇到了同样的问题..然后我在
中发现了问题if (cell == nil) {
// cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease];
}
使用
switch(indexPath.section)
和大括号中的整个代码......比如
if (cell == nil) {
// cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease];
switch(indexPath.section) .........
.........
.......
}
return cell;
}
希望这会起作用
答案 4 :(得分:-2)
首先,因为你明确地告诉它在两个地方丢失它的数据:
tfText[0] = [[UITextField alloc] initWithFrame:CGRectMake(125,15, 170, 40)]; // Number one cell.accessoryView = tfText[0]; tfText[0].delegate = self; tfText[0].text = @""; // <== Set this to something useful, instead.
然后有这个:
cell = [[[CustomCellStudentData alloc] initWithFrame:CGRectZero reuseIdentifier:nil] autorelease];
如果要重用单元格,则需要该标识符! 由于您似乎至少有两种类型的单元格,因此至少应该有两个不同的标识符...
接下来,您将自己设置为文本字段的委托 - 这一切都很好,但您是否实现了UITextFieldDelegate
协议并将输入的数据存储在textFieldDidEndEditing:
中?
有几种方法可以解决这个问题,但您应该为每个部分创建一个NSMutableArray
来存储输入字段中的值。 (您应该在初始化程序中设置。)
哦,此刻,你正在整个地方泄漏UITextField
......