2012-02-22 3 views
0

Когда я заменяю @"hello" на titlestring таблицы, ячейка отображается пустой, если я оставлю привет, все работает, включая «detailsstring». Я не знаю, почему это происходит, потому что detailsstring настроен точно так же, как titlestring. вот код: в файле .m У меня естьNSUserDefaults не сохраняются в ячейке таблицы

@synthesize detailsstring; 
@synthesize titlestring; 

и все это определяется так же в .h в ом у меня есть это, а также:

- (void)viewDidLoad{   
    titlestring =[[NSUserDefaults standardUserDefaults] objectForKey:@"titletext"]; 
    detailsstring = [[NSUserDefaults standardUserDefaults] objectForKey:@"details"]; 

    tabledata = [[NSArray alloc] initWithObjects:@"hello", nil]; 
    tablesubtitles = [[NSArray alloc] initWithObjects:detailsstring, nil]; 
    [super viewDidLoad]; 
} 

Теперь, Я сохраняю эти Userdefaults в другом контроллере. Вот действие кнопки сохранения в другом контроллере представления:

- (IBAction)saveButton:(id)sender { 
    NSUserDefaults *titletext = [NSUserDefaults standardUserDefaults]; 
    [titletext setObject:titleTextfield.text forKey:@"titletext"]; 

    NSUserDefaults *details = [NSUserDefaults standardUserDefaults]; 
    [details setObject:detailstextfield.text forKey:@"details"]; 

    NSUserDefaults *categoryUser = [NSUserDefaults standardUserDefaults]; 
    [categoryUser setInteger:selectedCategory forKey:@"category"]; 
} 

Что я делаю неправильно?

+0

вы используете ARC? – ThomasW

+0

Также, как вы используете tablesubtitles? Есть ли что-нибудь, ссылающееся на это? – ThomasW

+0

'[super viewDidLoad]' должно быть первым, что вы должны вызвать методом 'viewDidLoad'. Это не решит проблему, которую вы испытываете, но это определенно то, чего вы не должны делать. –

ответ

3

Прежде всего, одного экземпляра NSUserDefaults достаточно для всех трех модификаций. Чтобы «немедленно» нажать на изменения в файловой системе, вы можете позвонить [userDefaults synchronize];. В противном случае нет гарантии, что ваши изменения будут сохранены мгновенно. Apple предлагает только вызвать этот метод, если вы не можете дождаться сохранения изменений.

- (IBAction)saveButton:(id)sender { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:titleTextfield.text forKey:@"titletext"]; 
    [userDefaults setObject:detailstextfield.text forKey:@"details"]; 
    [userDefaults setInteger:selectedCategory forKey:@"category"]; 
    [userDefaults synchronize]; 
} 

В вашем методе viewDidLoad:, попробуйте выводить сохраненные значения, чтобы проверить целостность вашего приложения:

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"details"]); 
+0

Кроме того, если вы просто тестируете свое приложение и выходите из него очень рано, шансы высоки, он не сохраняется в короткий промежуток времени, когда приложение работает. Я должен был с этим справиться. – fscheidl

+0

'synchronize' связано только с записью результатов на диск (флеш-память для iOS). Вам не нужно вызывать 'synchronize', чтобы прочитать значение, которое вы только что установили для пользовательских значений по умолчанию. –

+0

Ну, если в первую очередь ничего не сохраняется на диске, как бы вы могли прочитать пользовательские значения по умолчанию? – fscheidl

Смежные вопросы