滚动时 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 值。

这是我的代码。

我正在使用自定义单元格GenericTableViewCellself.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 文件中,我声明了一个名为 textFieldValuesNSMutableDictionary 喜欢

@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 DataNSUserDefaults 好吧,假设您使用 NSUserDefaults 保存了它,代码将是:保存 - [[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"MyTextFieldValue"] 和检索 - [[NSUserDefaults standardUserDefaults] valueForKey:@"MyTextFieldValue"] 看,如果我这样保存,那么我怎么能根据哪个部分、行和列传递这个值...我有 n 个部分..并且在每个部分中我有 n 个行。那么我如何知道在检索时将哪个值分配给哪个文本字段 您也可以使用此方法保存字典类型的对象。因此,您可以根据部分和行创建一个键,然后将值保存到该键。保存值并在需要时使用它是另一个问题,首先尝试保存单个值以查看它是否解决了您的问题,然后保存多个值并再次测试:)

以上是关于滚动时 UITextField 上的值更改的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 文本更改时 UIScrollView 滚动到底部

滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改

如何在 ios 中使用自动布局更改滚动视图内容大小

没有看到 UIScrollView 上的 UITextField 时 resignFirstResponder

更新字段时,UITextField“值已更改”未触发

是否有任何通用解决方案可以在屏幕上的键盘上方滚动 UITextView 和 UITextField