滚动时 UITextField 上的值更改
Posted
技术标签:
【中文标题】滚动时 UITextField 上的值更改【英文标题】:Value On UITextField Changes On Scroll 【发布时间】:2016-09-23 13:43:37 【问题描述】:在问这个问题之前,我已经搜索了很多,但找不到合适的答案。
我有一个带有Three
部分和n
列数的tableView。没有。每个部分的行数也不固定。最后两列包含UITextField
,每个文本字段中的初始值为0.00
。因此,在每行中输入值后,如果我关闭该部分,则 textField 值将恢复为0.00
。谁能告诉我如何保存这个 textField 值。
这是我的代码。
我正在使用自定义单元格GenericTableViewCell
和self.columnHeaderArray
确定表格视图中有多少列。 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 的cmets 并带领我解决了这个问题。
守则:
在我的 .h
文件中,我声明了一个名为 textFieldValues
的 NSMutableDictionary
喜欢
@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
方法。
-(BOOL) textFieldShouldReturn:(UITextField *)textField
NSString *key = [NSString stringWithFormat: @"%ld-%ld", (long)indexPath.section, (long)indexPath.row];
self.textFieldValues[key] = textField.text;
return self.textFieldValues[key];
谢谢大家
【问题讨论】:
【参考方案1】:当您滚动单元格的关闭视图时,它们会被释放。每次单元格滚动回视图时,它都会重新初始化。如果您想保留文本字段的值,我会尽可能保存它的内容并保留该值。
我之前通过保存包含我的 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];
希望对您有所帮助。
【讨论】:
当然,这是一个例子。 k 让我试试这个,让你知道 :) 我在声明 nsdictionary 时遇到错误,说Too few type arguments for class 'NSMutableDictionary (have 1, expected 2)
您需要实例化字典。将self.textFieldValues = [NSMutableDictionary new];
放入viewDidLoad
。
不,这不是因为实例化.. .h
文件中显示错误【参考方案2】:
每当您尝试在UITableView
中显示一个单元格时,都会调用cellForRowAtIndexPath
,并且在您的代码中,您每次都会为给定的indexPath
创建一个全新的单元格。因此,当您将值设置为 lblTextField
并再次显示它时,它会被重置。我的建议是恢复值,然后在processDataForCell
方法中将恢复的值设置为lblTextField
,这样该值将具有一致性。
【讨论】:
是的,我知道,但我的表格视图有未知部分,每个部分都有未知的行数。那么我该如何存储价值 通过textField.delegate = self
将您的类作为委托(UITextFieldDelegate
)添加到您的文本字段中,并在textFieldDidEndEditing
委托函数中通过textField.text
检索值,然后您可以将其存储在类变量中或如果您想将其保留在本地,您可以使用Core Data
或NSUserDefaults
。
好吧,假设您使用 NSUserDefaults
保存了它,代码将是:保存 - [[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"MyTextFieldValue"]
和检索 - [[NSUserDefaults standardUserDefaults] valueForKey:@"MyTextFieldValue"]
。
看,如果我这样保存,那么我怎么能根据哪个部分、行和列传递这个值...我有 n 个部分..并且在每个部分中我有 n 个行。那么我如何知道在检索时将哪个值分配给哪个文本字段
您也可以使用此方法保存字典类型的对象。因此,您可以根据部分和行创建一个键,然后将值保存到该键。保存值并在需要时使用它是另一个问题,首先尝试保存单个值以查看它是否解决了您的问题,然后保存多个值并再次测试:)以上是关于滚动时 UITextField 上的值更改的主要内容,如果未能解决你的问题,请参考以下文章
UITextField 文本更改时 UIScrollView 滚动到底部
滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改