2016-03-08 70 views
0

我之前問過這個問題,並關閉它認爲我得到了答案,我的錯誤[自動保存與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

以及我現在正在嘗試,但仍然沒有運氣。 – ash

+0

我正在使用出現/消失,但是當我更改視圖數據刪除。 – ash

回答

0

我希望應用程序在每次更改值時保存數據,並在用戶返回頁面時加載新值。

我會爲您提供斯威夫特版本,與obj-C版本在語義上是相同的,我敢肯定你知道如何編寫的OBJ-C的代碼,如果沒有,請讓我知道......(我注意到只有在我寫了Swift代碼之後才使用Obj-C,而且當時我的Obj-C已經變得生鏽......道歉)。

由於我不知道你是否使用UITextViewUITextField,我將爲它們提供版本(它們非常相似......)。

爲了當他們在文本字段/視圖改變爲保存值,你就必須掛鉤到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") 
    } 

} 

有我同時用於UITextViewUITextField,一個在每個文本變化觸發兩個委託方法,並且在文本字段失去焦點之後。無論你想在每次修改完成後保存到用戶的默認值(我不會推薦它,但肯定有使用情況...)。當文本字段丟失焦點時,我只會保存數據(如果退出應用程序,我不能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 
+0

謝謝你的幫助,但是你能否以obj c的形式展示我。 – ash

+0

你使用'UITextField'還是'UITextView'? –

+0

我已經使用UITextField – ash