当我们在表视图中滚动页面时,文本字段中的值变为null

时间:2011-06-03 12:13:26

标签: iphone objective-c

每个人都

我创建了一个这样的数据输入屏幕,其中每行包含一个文本字段 enter image description here

这里输入数据到文本字段后,如果我们滚动页面,所有文本字段的上升(超出视图)将返回到原始位置时设置为null,这是我的每个单元格的代码CustomCellStudentData是一个单元格类,我为标签创建了框架

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //static NSString *CellIdentifier = @"Cell";

    CustomCellStudentData *cell = (CustomCellStudentData*)[tableView dequeueReusableCellWithIdentifier:nil];

    if (cell == nil) {
      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,22, 170, 25)];
                    cell.accessoryView = tfText[0];
                    tfText[0].delegate=self;
                    tfText[0].font = [UIFont systemFontOfSize:14];
                    tfText[0].placeholder =@"<Student Name>";

                    cell.primaryLabel.text =@"Student Name: ";

                } 
                break;

                case 1: 
                {
                    tfText[1] = [[UITextField alloc] initWithFrame:CGRectMake(125,22, 170, 25)];
                    cell.accessoryView = tfText[1];
                    tfText[1].delegate=self;
                    tfText[1].font = [UIFont systemFontOfSize:14];
                    tfText[1].placeholder =@"<Student Age>";
                    tfText[1].keyboardType = UIKeyboardTypeNumbersAndPunctuation;
                   cell.primaryLabel.text =@"Student Age: ";
                } 
                break;

                case 2:
                {
                    cell.primaryLabel.text =@"Gender: ";

                    segmentedControl = [[UISegmentedControl alloc] initWithItems:nil];
                    segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain;
                    segmentedControl.frame = CGRectMake(125,22, 170, 25);
                    [segmentedControl insertSegmentWithTitle:@"Male" atIndex:0 animated:YES];
                    [segmentedControl insertSegmentWithTitle:@"Female" atIndex:1 animated:YES];
                    segmentedControl.selectedSegmentIndex = 1;
                    [segmentedControl setMomentary:NO];
                    [segmentedControl addTarget:self action:@selector(segmentSwitch:) forControlEvents:UIControlEventValueChanged];
                    cell.accessoryView =segmentedControl;
                }
                break;

                case 3:
                {
                    tfText[3] = [[UITextField alloc] initWithFrame:CGRectMake(125,22, 170, 25)];
                    cell.accessoryView = tfText[3];
                    tfText[3].delegate=self;
                    tfText[3].font = [UIFont systemFontOfSize:14];
                    tfText[3].placeholder =@"<dd/mm/yyyy>";
                    tfText[3].keyboardType = UIKeyboardTypeNumbersAndPunctuation;
                    cell.primaryLabel.text =@"Date Of Birth: ";
                }
    }
}

如果数据变为空,我怎么解决这个问题,任何人都可以帮助我, 提前谢谢

4 个答案:

答案 0 :(得分:2)

每次调用cellForRowAtIndexPath:时都会创建文本字段。我认为您可以通过在其他位置创建文本字段来解决此问题,可能是viewDidLoad或类似的方法,只需在调用cellForRowAtIndexPath:时设置附件视图即可。例如,

tfText[0] = [[UITextField alloc] initWithFrame:CGRectMake(125,22, 170, 25)];
tfText[0].delegate=self;
tfText[0].font = [UIFont systemFontOfSize:14];
tfText[0].placeholder =@"<Student Name>";

将前四行移至viewDidLoad并仅创建一次。让下面的线保持不变。

cell.accessoryView = tfText[0];

答案 1 :(得分:2)

因为每次制作单元格时都会重新创建文本字段。

取第一个单元格(索引0)

                tfText[0] = [[UITextField alloc] initWithFrame:CGRectMake(125,22, 170, 25)];
                cell.accessoryView = tfText[0];
                tfText[0].delegate=self;
                tfText[0].font = [UIFont systemFontOfSize:14];
                tfText[0].placeholder =@"<Student Name>";

                cell.primaryLabel.text =@"Student Name: ";

第一次创建表时,您将创建一个文本视图并将其添加到单元格中。然后,用户将他们的数据输入到单元格中(在这种情况下是他们的名字)。

然后,他们将桌子向下滚动并重新上升。

表视图将再次调用tableView:cellForRowAtIndexPath :.您的代码将索引0处的文本字段替换为新的空字符。

在switch语句中尝试这样的事情:

if (NULL == tfText[0]) {
    tfText[0] = [[UITextField alloc] initWithFrame:CGRectMake(125,22, 170, 25)];
    tfText[0].delegate=self;
    tfText[0].font = [UIFont systemFontOfSize:14];
    tfText[0].placeholder =@"<Student Name>";
}
cell.accessoryView = tfText[0];

cell.primaryLabel.text =@"Student Name: ";

答案 2 :(得分:1)

dequeueReusableCellWithIdentifier:nil

我相信这是问题,你可能会在那里得到其他类型的细胞。您应该为该表中使用的每种类型的单元格设置单元格标识符。

答案 3 :(得分:0)

看起来你正在处理有限数量的单元格......也许你不应该为出队而烦恼......只需像普通的控制元素一样处理它们......将它们粘在一个数组视图中加载和在cellForRowAtIndexPath中传递它们