2016-03-08 54 views
0

我想保存和加载多个文本框,我知道我做错了什么,因为当我添加另一个文本框到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];} 
+3

' - (空)textFieldDidEndEditing1:(*的UITextField)textField1'?我认为这种方法从未被调用过。 – Larme

回答

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]; 
} 

您可能还需要调查在可可触摸目标 - 动作机制 - 这些让你每个文本字段挂钩,以自己独立的操作方法,而不是使用代理方法,如果这就是你需要在你的应用程序。

只是一个快速抛开 - 看起来你可能对iOS很陌生,一般编程,所以你可能想集中精力学习Swift,而不是Objective C,因为你会发现几乎所有的过去两年的教程和指南都是用Swift编写的。如果你有一个特别的理由来学习Objective C,那也很好,我喜欢这两种语言,但是Swift肯定看起来更友善,而且现在所有的动作都在这里!

欢迎堆栈溢出

+0

谢谢你的帮助,但现在我不断收到一个错误,说使用未声明的标识符默认值。 – ash

+0

没关系,我只是需要添加 NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];到textFieldDidEndEditing。 – ash

0

所有UITextFields将调用“textFieldDidEndEditing”,因此您必须区分正在编辑哪个文本字段。例如为:

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

可能更适合在这里使用'switch'选项,而不是嵌套'else if' - 如果你有两个以上的文件 – Russell

+0

如果在Swift中进行编程......上面没有。对于Objective C,必须使用if-else。 – cbiggin

+0

即使使用这种方法,我似乎只能保存和加载textview或在您的案例textField1。 – ash