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

时间:2011-05-27 06:33:53

标签: iphone objective-c uitableview

Hii大家!

我在表格视图的每个单元格中都有一些文本字段,如下所示

enter image description here

如果我在文本字段中输入一些数据并再次向上和向下滚动视图,则文本字段中的数据将设置为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;
        }

提前完成

5 个答案:

答案 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 ......