UITextField上的值更改滚动

时间:2016-09-23 13:43:37

标签: ios objective-c uitableview uitextfield

在提出这个问题之前,我已经搜索了很多内容而无法找到合适的答案。

我有一个包含Three个部分和n列数的tableView。没有。每个部分中的行也不固定。最后两列包含UITextField,最初每个文本字段中的值为0.00。因此,如果我关闭该部分,则在每行输入值后,textField值将恢复为0.00。任何人都可以告诉我如何保存这个textField值。

这是我的代码。

我正在使用自定义单元格GenericTableViewCellself.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

感谢伙伴

2 个答案:

答案 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,这样该值将具有一致性。