我之前提出这个问题并关闭它认为我得到了答案,我的错误[自动保存值与NSuserDefaults] [1]不是我想要的答案。
我需要在查看视图控制器时永久保存和加载数据,我一直在使用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]; }
目前这就是我所拥有的并且正在使用按钮,但显然我不想要一个按钮,并且当我离开那个视图控制器并在我进入视图控制器时加载时它会保存。
答案 0 :(得分:0)
我希望应用程序在每次更改值时保存数据,并在用户返回页面时加载新值。
我将为您提供 Swift 版本,Obj-C版本在语义上是相同的,我相信您知道如何在Obj-C中编写代码,如果没有,请让我知道......(我注意到你在我编写Swift代码之后才使用Obj-C,那时候我的Obj-C已经生锈了......道歉)。
由于我不知道您是否使用UITextView
或UITextField
,我将为它们提供版本(它们非常相似......)。
为了在文本字段/视图中更改值时保存值,您必须在文本值更改时隐藏UITextField
/ UITextView
发出的事件。您可以通过将视图控制器设为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
两种委托方法,一种是在每次文本更改时触发,另一种是在文本字段失去焦点后。是否要在每次修改后保存到用户默认值取决于您(我不推荐它,但肯定有用例...)。我只会在文本字段失去焦点时保存数据(我不是100%确定文本字段在退出应用程序时是否会失去焦点,但我认为应该这样做,所以这也应该保存以保存数据)。
在其中一种方法中保存文本字段的值,你应该好好去...
并确保从viewDidLoad()
或viewDidAppear()
加载数据:
override func viewDidLoad() {
super.viewDidLoad()
_textview.text = NSUserDefaults.standardUserDefaults().valueForKey("textfield_text") as! String
_textview.delegate = self
}
在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