2016-03-08 116 views
0

我想保存和加載多個文本框,我知道我做錯了什麼,因爲當我添加另一個文本框到NSUserDefaults我有我的文本框混合數據。例如textfield one將保存爲「0」,textfield 2保存爲「1」,儘管當我離開控制器並返回時,它突然將文本視圖1更改爲「1」,並將文本視圖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];} 
+3

' - (空)textFieldDidEndEditing1:(*的UITextField)textField1'?我認爲這種方法從未被調用過。 – Larme

回答

1

textFieldDidEndEditing:UITextField使用的委託方法。當您撥打[_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]; 
} 

您可能還需要調查在可可觸摸目標 - 動作機制 - 這些讓你每個文本字段掛鉤,以自己獨立的操作方法,而不是使用代理方法,如果這就是你需要在你的應用程序。

只是一個快速拋開 - 看起來你可能對iOS很陌生,一般編程,所以你可能想集中精力學習Swift,而不是Objective C,因爲你會發現幾乎所有的過去兩年的教程和指南都是用Swift編寫的。如果你有一個特別的理由來學習Objective C,那也很好,我喜歡這兩種語言,但是Swift肯定看起來更友善,而且現在所有的動作都在這裏!

歡迎堆棧溢出

+0

謝謝你的幫助,但現在我不斷收到一個錯誤,說使用未聲明的標識符默認值。 – ash

+0

沒關係,我只是需要添加 NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];到textFieldDidEndEditing。 – ash

0

所有UITextFields將調用「textFieldDidEndEditing」,因此您必須區分正在編輯哪個文本字段。例如爲:

- (void)textFieldDidEndEditing:(UITextField *)textField{ 
    if (textField == textField1) { 
     : 
    } else if (textField == textField2) { 
     : 
    } 
} 
+0

可能更適合在這裏使用'switch'選項,而不是嵌套'else if' - 如果你有兩個以上的文件 – Russell

+0

如果在Swift中進行編程......上面沒有。對於Objective C,必須使用if-else。 – cbiggin

+0

即使使用這種方法,我似乎只能保存和加載textview或在您的案例textField1。 – ash