我的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;
}
}
答案 0 :(得分:0)
屏幕外的细胞可以重复使用。这是正常的行为。您需要填写正确的方法以确保其内容得到刷新。
正如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;
}