在提出这个问题之前,我已经搜索了很多内容而无法找到合适的答案。
我有一个包含Three
个部分和n
列数的tableView。没有。每个部分中的行也不固定。最后两列包含UITextField
,最初每个文本字段中的值为0.00
。因此,如果我关闭该部分,则在每行输入值后,textField值将恢复为0.00
。任何人都可以告诉我如何保存这个textField值。
这是我的代码。
我正在使用自定义单元格GenericTableViewCell
,self.columnHeaderArray
确定tableview中有多少列。 columnHeaderArray Value包含列类型,值等列表详细信息...
cellForRowAtIndexPath
中的:
GenericTableViewCell *cell = nil;
if (cell == nil)
{
cell = [[GenericTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"withColumns:self.columnHeaderArray];
for (GenericTableColumn *theColumn in self.columnHeaderArray)
{
[self processDataForCell:cell forColumn:theColumn atIndexPath:indexPath];
}
return cell;
}
}
processDataForCell
是一种使用值和文本字段更新列的方法。在此方法中,我检查列类型并将值插入每列。
代码就是。
switch (column.columnType)
{
case textField:
{
UITextField *lblTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 4, label.frame.size.width - 10, label.frame.size.height - 6)];
lblTextField.delegate = self;
lblTextField.text = theValue; // setting the textField value iniatally 0.00
lblTextField.borderStyle = UITextBorderStyleRoundedRect;
lblTextField.layer.borderWidth = 1.0;
lblTextField.layer.borderColor = [[UIColor blackColor] CGColor];
[label addSubview:lblTextField];
break;
}
}
非常感谢任何帮助。
编辑:我解决了这个问题,感谢@Ayazmon和@naturalnOva的评论,并引导我解决这个问题。
守则:
在我的.h
文件中,我声明了一个名为NSMutableDictionary
的{{1}}
textFieldValues
在@property (nonatomic, strong) NSMutableDictionary <NSString *, NSString *> *textFieldValues;
中,我将此词典实例化为
viewDidLoad
在self.textFieldValues = [NSMutableDictionary new];
方法中,我用
processDataForCell
对我而言switch (column.columnType)
{
case textField:
{
UITextField *lblTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 4, label.frame.size.width - 10, label.frame.size.height - 6)];
lblTextField.delegate = self;
lblTextField.tag = indexPath.row;
if ([self.textFieldValues count] != 0) {
// pass in the indexPath from cellForRow
NSString *key = [NSString stringWithFormat: @"%ld-%ld", (long)indexPath.section, (long)indexPath.row];
lblTextField.text = self.textFieldValues[key];
} else {
lblTextField.text = theValue; // For setting the textField value iniatally 0.00
}
lblTextField.borderStyle = UITextBorderStyleRoundedRect;
lblTextField.layer.borderWidth = 1.0;
lblTextField.layer.borderColor = [[UIColor blackColor] CGColor];
[label addSubview:lblTextField];
break;
}
}
方法UITextField delegate
未被调用。所以我使用了textFieldShouldEndEditing(_:)
方法。
textFieldShouldReturn
感谢伙伴
答案 0 :(得分:0)
当您滚动单元格的视图时,它们将被取消分配。每次单元格滚动回到视图时,它都会重新初始化。如果你想保留文本字段的值,我可以保存它的内容,并保留该值。
我之前已经通过保存包含indexPaths值的字符串字典来完成此操作。每次文本字段作为第一响应者重新出现时,我都会将该字段的值存储在我的字典中。
您应该在视图控制器中注册UITextField
的委托,并覆盖textFieldDidEndEditing(_:)
,您可以在其中访问文本字段的值。
示例:强>
为字段值创建属性:
@property (nonatomic, strong) NSMutableDictionary *textFieldValues;
覆盖UITextFieldDelegate
方法:
-(void) textFieldDidEndEditing: (UITextField *)textField
{
NSString *key = [NSString stringWithFormat: @"%ld-%ld", (long)indexPath.section, (long)indexPath.row];
self.textFieldValues[key] = textField.text;
}
使用上面的代码,为文本字段分配标记,并使用字典分配字段内容:
UITextField *lblTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 4, label.frame.size.width - 10, label.frame.size.height - 6)];
lblTextField.delegate = self;
lblTextField.tag = indexPath.row;
// pass in the indexPath from cellForRow
NSString *key = [NSString stringWithFormat: @"%ld-%ld", (long)indexPath.section, (long)indexPath.row];
lblTextField.text = self.textFieldValues[key];
lblTextField.borderStyle = UITextBorderStyleRoundedRect;
lblTextField.layer.borderWidth = 1.0;
lblTextField.layer.borderColor = [[UIColor blackColor] CGColor];
[label addSubview:lblTextField];
希望有所帮助。
答案 1 :(得分:0)
cellForRowAtIndexPath
中显示单元格时,都会调用 UITableView
,并且在您的代码中,每次都会为给定的indexPath
创建一个全新的单元格。因此,当您将值设置为lblTextField
然后再次显示它时,它将被重置。我的建议是恢复该值然后在processDataForCell
方法中将恢复的值设置为lblTextField
,这样该值将具有一致性。