当我滚动表格视图时,文本字段中的数据设置为 null

Posted

技术标签:

【中文标题】当我滚动表格视图时,文本字段中的数据设置为 null【英文标题】:Data in the text field is set to null when I scroll the table view 【发布时间】:2011-05-27 06:33:52 【问题描述】:

大家好!

我在表格视图的每个单元格中都有一些文本字段,就像这样

如果我在文本字段中输入一些数据并再次上下滚动视图,则文本字段中的数据设置为空。为什么会发生这种情况,我该如何避免这种情况?

以下是我的细胞构造代码

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;
        

提前感谢

【问题讨论】:

【参考方案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;

【讨论】:

感谢您的回复,我是 iphone 新手,您能给我一些示例代码吗 @Ravi 我这里没有 Xcode,所以我在文本编辑器中输入了所有代码,它可能包含一些拼写错误。【参考方案2】:

在用户写入时/同时保存数据(将自己设置为文本字段的代表)并在 cellForRow 检查是否保存了数据。如果是,请加载它。否则设置占位符。

【讨论】:

【参考方案3】:

您必须保存在表格单元格中输入的数据,这样当您滚动表格视图时,它不会丢失。

希望对你有帮助.....

【讨论】:

【参考方案4】:

我也有同样的问题..然后我发现问题在

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;

希望这会奏效

【讨论】:

【参考方案5】:

首先,因为您明确告诉它在两个地方丢失数据:

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 来存储输入字段中的值。 (您应该在初始化程序中进行设置。)

哦,此刻,你正在到处泄露UITextFields...

【讨论】:

以上是关于当我滚动表格视图时,文本字段中的数据设置为 null的主要内容,如果未能解决你的问题,请参考以下文章

当键盘中的“下一步”返回按钮时滚动带有文本字段的表格视图

iPhone-在表格视图滚动文本字段设置为零

滚动表格视图时删除的文本字段值?

滚动表格视图时文本字段为空

滚动表格视图时隐藏文本字段数据

编辑文本字段时偏移滚动视图?