使用Objective-C for iPhone中的单元格中的UITextFields滚动问题

时间:2010-10-22 12:39:49

标签: iphone objective-c uitableview uitextfield tableview

我有以下问题:我有一个带有7个自定义单元格的UITableView。每个单元格都包含一个标签和一个UITextField。由于单元格有点大,您必须向下滚动才能看到最后3个单元格。问题是,只要我向下滚动,前3个单元格(那些不可见的单元格)的文本字段中的文本就会被删除。剩下的就是占位符。当我向后滚动时,最后3个单元格也是如此。第四个单元格中的文本字段保留其文本,因为它始终可见。 有谁知道如何解决这个问题?

最好的问候。

更新:以下是相应评论的代码:

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

NewXYZTableCell *cell = (NewXYZTableCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil){
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NewXYZTableCell" owner:nil options:nil];

    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[NewXYZTableCell class]])
        {
            cell = (NewXYZTableCell *)currentObject;
            break;
        }
    }
}

switch (indexPath.row) {            
    case 0:
        cell.myLabel.text = @"XYZ";
        // and so on... 
    default:
        break;
}   
return cell;}

2 个答案:

答案 0 :(得分:1)

您可能使用出列机制来填充UITableView及其单元格。这意味着已经分配并且当前不在屏幕上的单元格可以重复使用并填充其他内容。这样可以节省为每行分配新单元的性能成本。因此,即使具有大量单元格的表格视图也可以很好地执行,因为它只需要同时处理六个或七个单元格。

这也可能发生在你身上。您的单元格将从屏幕滚动,现在可以自由重新进入屏幕的新单元格(显示不同的内容)。因此,您将拥有另一个标题和另一个(新)文本字段。因此,如果单元格从屏幕滚动,您需要将输入保存在某处。例如,您可以收听UITextFieldTextDidChangeNotification

以观察员身份注册您的控制器,例如在-viewDidLoad中:     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChanged :) name:UITextFieldTextDidChangeNotification object:textField]

然后实现您的方法,在本例中为textFieldChanged:,其中NSNotification*作为参数并保存您的输入:

-(void)textFieldChanged:(NSNotification *)notification {
    ...
}

如果它们在屏幕上向后滚动,请不要忘记将输入重新插入到单元格中。

另一个选择是不使用出列并在需要时立即创建所有单元格。如果你只有很少的细胞,这可能是一个更好的主意。您需要注意在-cellForRowAtIndexPath:中返回正确的单元格。

答案 1 :(得分:0)

将此作为新答案发布,以便我可以使用代码格式化。

我的建议是将七个单元保存在七个实例变量中并创建适当的getter。因此,在.h文件中声明变量:

NewXYZTableCell *cell0;
...
NewXYZTableCell *cell6;

在您的实现中,编写一个getter:

-(NewXYZTableCell*) getCellNumber:(int)cellNumber {
    NewXYZTableCell *cell;
    switch (cellNumber)
    {
        case 0:
            cell = cell0;
            break,

        ...

        case 6:
            cell = cell6;
            break,
    }

    if (cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NewXYZTableCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[NewXYZTableCell class]])
            {
                cell = (NewXYZTableCell *)currentObject;
                break;
            }
        }
    }
    return cell;
}

如果之前不存在,则此getter将在创建后返回具有相应数字的单元格。然后你可以在-tableView:cellForRowAtIndexPath:

中使用它
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return [self getCellNumber:indexpath.row];
}