ios - 自动保存和加载使用

标签 ios

我之前问过这个问题,并认为我得到了答案而关闭了它,我的错误 [使用 NSuserDefaults 自动保存值][1] 不是我正在寻找的答案。

在查看 View Controller 时,我需要永久保存和加载数据,我已经使用 nsuserdefaults 很长时间了,但是现在我不希望用户必须单击“保存”和“加载”按钮。我希望应用程序在每次值更改时保存数据,并在用户返回页面时加载新值。

根据我读到的内容,我可以使用核心数据或 sqlite 数据库,但是仅保存两个文本字段似乎需要做很多工作。

必须有另一种简单的方法来解决这个问题。

-(IBAction)savedata:(id)sender; {

NSString *savestring = _textview.text;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:savestring forKey:@"FirstTextFieldKey"];
[defaults synchronize];  }

- (IBAction)loaddata:(id)sender; {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *loadstring = [defaults objectForKey:@"FirstTextFieldKey"];
[_textview setText:loadstring]; }

目前,这就是我所拥有的,并且正在通过按钮使用它,但显然我不想要按钮,并且希望它在我离开该 View Controller 时保存并在我进入 View Controller 时加载。

最佳答案

I would like the application to save the data each time values have been changed and load the new values when the user goes back to the page.

我将为您提供 Swift 版本,Obj-C 版本在语义上是相同的,我相信您知道如何用 Obj-C 编写代码,如果不知道,请让我知道...(我注意到您仅在我编写 Swift 代码后才使用 Obj-C,而那些日子我的 Obj-C 已经生锈了...抱歉)。

因为我真的不知道您使用的是 UITextView 还是 UITextField,所以我将为它们提供版本(它们很漂亮类似...)。

为了在文本字段/ View 中更改值时保存值,您必须 Hook UITextField/UITextView 在其文本值发生时发出的事件变化。您可以通过将 View Controller 设为 UITextFieldDelegate/UITextView 来完成此操作。

如果您正在使用 UITextField:

class MyViewController : UIViewController, UITextFieldDelegate{

  var _textview : UITextField!

  override func viewDidLoad() {
    super.viewDidLoad()

    _textview.delegate = self
  }

  func textFieldDidEndEditing(textField: UITextField) {

    // this is called after the textfield loses focus
    // NSUserDefaults.standardUserDefaults().setValue(textField.text, forKey: "textfield_value")

  }

  func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    // this is called whenever the textfield's text changes
    NSUserDefaults.standardUserDefaults().setValue(textField.text, forKey: "textfield_value")
    return true

  }

}

如果您正在使用 UITextView:

class MyViewController : UIViewController, UITextViewDelegate{

  var _textview : UITextView!

  override func viewDidLoad() {
    super.viewDidLoad()

    _textview.delegate = self
  }

  func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    // this is called after the textfield loses focus
    // I would not recommend this, but it should work as well in here
    // NSUserDefaults.standardUserDefaults().setValue(textView.text, forKey: "textview_value")
    return true

  }

  func textViewDidEndEditing(textView: UITextView) {

    // this is called whenever the textview's text changes
    NSUserDefaults.standardUserDefaults().setValue(textView.text, forKey: "textview_value")
  }

}

我为 UITextViewUITextField 使用了两种委托(delegate)方法,一种在每次文本更改时触发,另一种在文本字段失去焦点后触发。是否要在每次修改后保存为用户默认值取决于您(我不推荐它,但肯定有用例......)。我只会在文本字段失去焦点时保存数据(我不是 100% 确定如果你退出应用程序文本字段是否失去焦点,但我认为它应该,所以这也应该保存以保存你的数据)。

在其中一种方法中保存文本字段的值,您应该可以开始了...

还要确保从 viewDidLoad()viewDidAppear() 加载数据:

override func viewDidLoad() {
    super.viewDidLoad()

    _textview.text = NSUserDefaults.standardUserDefaults().valueForKey("textfield_text") as! String

    _textview.delegate = self
  }




objective-C

在你的 ViewController.h 中:

@interface ViewController : UIViewController <UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *textview;

@end

在你的 ViewController.m 中:

@implementation ViewController 


- (void)viewDidLoad {
  [super viewDidLoad];
  // 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];

}

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

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

}

@end

关于ios - 自动保存和加载使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869594/

相关文章:

IOS UINavigationController、pushViewController 不工作

ios - 获取EKEvent的日历标题

ios - Swift:计算属性的默认初始化器

ios - Xcode 10 签名错误 : Frameworks/libswiftsimd. dylib:代码对象根本未签名

ios - ARC是否管理CGPDF类型的内存?

javascript - 使用 React-Native 推送通知

TableView Controller 中的 iOS/AFNetworking TableView 不显示从响应对象填充的数组中的任何数据

ios - CKQueryOperation iOS 9仅可插入工作

ios - 在 Firebase 3 上更改密码时如何验证用户的当前密码?

ios - 如何在 iOS 8 中使用 Touch ID 传感器