我之前问过这个问题,并认为我得到了答案而关闭了它,我的错误 [使用 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")
}
}
我为 UITextView
和 UITextField
使用了两种委托(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/