ios - 保存和加载多个文本字段

标签 ios objective-c

我正在尝试保存和加载多个文本字段,我知道我做错了什么,因为当我向 NSUserDefaults 添加另一个文本字段时,我的文本字段混合了数据。例如,文本字段一将保存为“0”,文本字段2保存为“1”,但当我离开 Controller 并返回 Controller 时,它突然将 TextView 一更改为“1”,将 TextView 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];}

最佳答案

textFieldDidEndEditing:UITextField 使用的委托(delegate)方法。当您调用 [_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 中的目标-操作机制 - 这些允许您将每个文本字段连接到它自己的单独操作方法,而不是使用委托(delegate)方法,如果您的应用需要这样做的话。

顺便说一句 - 看起来您可能对 iOS 和一般编程还很陌生,因此您可能希望集中精力学习 Swift,而不是 Objective C,因为您会找到几乎所有的教程过去两年的指南都是用 Swift 编写的。如果您有特殊的理由学习 Objective C,那也很好,我喜欢这两种语言,但 Swift 显然更友好,而且现在所有的行动都在这里!

欢迎来到 Stack Overflow 😊

关于ios - 保存和加载多个文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873363/

相关文章:

iphone - 我如何规划警报声音?

ios - SpriteKit 中的垂直无限滚动背景

iOS 应用内购买在生产环境中无声无息地失败

c# - Xamarin ios:将Sqlite数据库查询结果分配给List

ios - 从 iPhone 6 中的气压计收集相对高度

ios - Parse.com缓存复合查询

ios - 像这样在 UILabel 中获得一个看起来正常的 unicode 向下箭头 ⬇

ios - 如何设置 UIContextualAction 的圆角半径?

ios - 如何获得使用过我们应用程序的 Facebook 好友?

objective-c - Magic Mouse 扩展功能 : Do I Need a kext?