保存并加载多个文本字段

时间:2016-03-08 16:57:59

标签: ios objective-c

我正在尝试保存并加载多个文本字段,我知道我做错了,因为当我向NSUserDefaults添加另一个文本字段时,我的文本字段混合了数据。例如,textfield one将被保存为“0”而textfield 2将被保存为“1”,但是当我离开控制器并返回到它时,它会突然将文本视图1更改为“1”并将文本视图2更改为我之前键入的内容

此代码适用于保存和加载一个文本字段,但在添加另一个文本字段时会混乱。

[_textview setText:[defaults valueForKey:@"textfield_text"]];
[_textview setDelegate:self];

- (void)textFieldDidEndEditing:(UITextField *)textField{

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:textField.text forKey:@"textfield_text"];
[defaults synchronize];}

然后,当我尝试添加两个文本字段时,我发生上述错误。

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:YES]; {
// Do any additional setup after loading the view, typically from a nib.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[_textview setText:[defaults valueForKey:@"textfield_text"]];
[_textview setDelegate:self];


NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];

[_textview1 setText:[defaults1 valueForKey:@"textfield_text1"]];
[_textview1 setDelegate:self];   }}

- (void)textFieldDidEndEditing:(UITextField *)textField{

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:textField.text forKey:@"textfield_text"];
[defaults synchronize];}

 - (void)textFieldDidEndEditing1:(UITextField *)textField1{

NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
[defaults1 setValue:textField1.text forKey:@"textfield_text1"];
[defaults1 synchronize];}

2 个答案:

答案 0 :(得分:1)

textFieldDidEndEditing:UITextField使用的委托方法。当您致电[_textview setDelegate:self][_textview1 setDelegate:self]时,您就会告诉两个文本字段来调用textFieldDidEndEditing:方法。您调用其中一个文本字段_textview1的事实并不意味着Apple的UITextField代码知道您还实现了一个名为textFieldDidEndEditing1:的方法。它是一种非常有效的方法,它从未被您或文本字段调用过(正如Larme在评论中指出的那样)。

您需要处理textFieldDidEndEditing:实现中的两个文本字段,因此您必须确定哪个文本字段正在调用该方法,因此哪个用户默认条目要更新。例如:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [_textview setText:[defaults valueForKey:@"textfield_text"]];
    [_textview setDelegate:self];
    [_textview1 setText:[defaults valueForKey:@"textfield_text1"]];
    [_textview1 setDelegate:self];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *defaultsKeyForTextField;
    if ([textField isEqual:_textview]) {
        defaultsKeyForTextField = @"textfield_text";
    } else {
        defaultsKeyForTextField = @"textfield_text1";
    }
    [defaults setValue:textField.text forKey:defaultsKeyForTextField];
    [defaults synchronize];
}

您可能还想调查Cocoa Touch中的目标操作机制 - 这些允许您将每个文本字段连接到其自己的单独操作方法,而不是使用委托方法,如果这是您需要的你的应用。

快速放弃 - 看起来你可能对iOS和编程很新,所以你可能想把精力集中在学习Swift而不是Objective C上,因为你几乎找到了所有过去两年的教程和指南都是用Swift编写的。如果你有特别的理由去学习目标C,这一切都很好,我喜欢这两种语言,但斯威夫特当然看起来更友好,现在所有的行动都在这里!

欢迎使用Stack Overflow

答案 1 :(得分:0)

所有UITextFields都会调用" textFieldDidEndEditing"所以你必须区分正在编辑的文本字段。 E.g:

- (void)textFieldDidEndEditing:(UITextField *)textField{
   if (textField == textField1) {
      :
   } else if (textField == textField2) {
      :
   }
}