遇到UITextField和UITableViewCells的问题

时间:2011-11-23 20:21:58

标签: iphone memory-management uitableview uitextfield

我的UITextField UITableViewCell中有一个UITableView。我总共有11个细胞。当我在单元格中输入文本,并将单元格从屏幕滚动时,该文本将被清除。

似乎可能是细胞正在被释放或解除分配。只有11个,所以它不是太大的问题,但是如何在这个视图中始终显示所有单元格的textFields

这是我正在使用的代码。是因为我没有像数组这样的数据源吗?如果服务器中有文本,我会从childAppointmentDictionary初始提取文本,否则用户输入文本并将其保存到NSString

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CellIdentifier = @"textCell";
    VitalsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    switch (indexPath.row) {
        case 0:
            cell.vitalsLabel.text = @"Temperature";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
            self.temperatureTextField = cell.textField;
            break;
        case 1:
            cell.vitalsLabel.text = @"Pulse";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"pulse"];
            self.pulseTextField = cell.textField;
            break;
        default:
            break;
    }
    return cell;
}

- (void) textFieldDidEndEditing:(UITextField *)textField{
    if (textField == temperatureTextField){
        self.temperatureString = self.temperatureTextField.text;
    } 
    else if (textField == pulseTextField){
        self.pulseString = self.pulseTextField.text;
    }
}

enter image description here

2 个答案:

答案 0 :(得分:0)

屏幕外的细胞可以重复使用。这是正常的行为。您需要填写正确的方法以确保其内容得到刷新。

http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath

正如Gabriele指出的那样,你需要使用tableView:cellForRow:替换文本。

答案 1 :(得分:0)

当单元格关闭时,由于性能原因,内部的所有视图都被取消分配。它不存储您的文本(NSString),当单元格进入屏幕时,TableView重绘它但没有文本。

您的文本(NSString)必须被视为您的模型。所以在tableView:cellForRow中:你需要每次将你想要的NSString设置为文本。

一些代码

您的方法接近于良好,但您需要至少使用cellIdentifier分配一次单元格。正如我所想的那样,单元格需要使用textfield或类似的子类进行子类化,并使用dequeueReusableCellWithIdentifier:从tableView中检索单元格模板。 检索单元格模板后,您可以配置文本字段的文本。每次tableView:cellForRowAtIndexPath都会使用存储在模型中的NSString(在您的情况下为NSDictionary)调用tableViewDataSource来填充此Textfields。 如果您为表格分层静态行数,我建议您使用枚举来保持代码的可读性。我建议也阅读A Closer Look at Table-View Cells。这非常有用。 希望这有帮助。

typedef enum {
    kCellRowTemperature = 0,
    kCellRowPulse
} CellRowTAG;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellIdentifier = @"textCell";
    VitalsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[VitalsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    switch (indexPath.row) {
        case kCellRowTemperature:
            cell.vitalsLabel.text = @"Temperature";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
            self.temperatureTextField = cell.textField;
            break;
        case kCellRowPulse:
            cell.vitalsLabel.text = @"Pulse";
            cell.textField.text = [self.childAppointmentDictionary objectForKey:@"pulse"];
            self.pulseTextField = cell.textField;
            break;
        default:
            break;
    }
    return cell;
}