iPhone: сохранить значения NSUserDefaults, когда приложение закрыто - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь реализовать функцию «Добавить в избранное» с помощью NSUserDefaults. Пока что я написал следующий код.

- (void)favouriteButtonClicked:(id)sender
{
favselected = !favselected; // favselected is BOOL property
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString* viewname = @"custom";

if(favselected) {
    [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
    [appDelegate addTOFavourites:self.ViewID viewType:self.ViewType];
} else {
    [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
    [appDelegate removeFromFavourites:self.ViewID viewType:self.ViewType];
}
}

Работает нормально, пока мое приложение работает, но когда я убил свое приложение, я теряю все свои сохраненные значения, поэтому при следующей загрузке представления в методе load метод isAddedToFabilities возвращает false. Есть ли способ сохранить мои ценности? Я что-то упустил?

    if([appDelegate isAddedToFavorites:self.ViewID]) {
        [favButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateNormal];
        favselected = YES;
    } else {
        [favButton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
        favselected = NO;
    }

Edit:

Я попытался использовать NSMutableDictionary, так как мне нужно добавить несколько значений ключа, но следующий метод всегда отображает Count = 0 даже после добавления объекта в словарь. Любая помощь могла бы быть полезна. Спасибо.

-(BOOL)isAddedToFavorites:(NSString*)viewID {
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID])
    return YES;

return NO;
}

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType {

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(standardUserDefaults) {
    if(![dict objectForKey:viewID])
        [dict setObject:viewType forKey:viewID]; // It is coming here but still count zero!

    NSLog(@"count = %d", [dict count]);

    [standardUserDefaults setObject:dict  forKey:kFavouriteItemsKey]; // Always dict remains null with 0 objects in it
    [standardUserDefaults synchronize];
    [dict release];
}
}

-(void)removeFromFavourites:(NSString*)viewID viewType:(NSString*)viewType {

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(standardUserDefaults) {
    if ([dict objectForKey:viewID])
        [dict removeObjectForKey:viewID];

    [standardUserDefaults setObject:dict  forKey:kFavouriteItemsKey];
    [standardUserDefaults synchronize];
    [dict release];
}
}

Спасибо.

1 Ответ

3 голосов
/ 05 июля 2011

NSUserDefaults фактически используется для постоянного хранения значений, фактически, если вы создадите какие-либо настройки для вашей программы, они будут сохранены как NSUserDefaults.

Я думаю, что проблема заключается в том, что вы не сохраняете его с тем же ключомвы восстанавливаете.Попробуйте сохранить так:

  //To save
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:appDefaults forKey:kFavouriteItemsKey];
  [[NSUserDefaults standardUserDefaults] synchronize];

  //To retrieve
 NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
 NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey]   mutableCopy];

Для словаря попробуйте:

 NSDictionary *myDictionary= [[NSUserDefaults standardUserDefaults] objectForKey:kFavouriteItemsKey];

        // Create a mutable dictionary to replace the old immutable dictionary
    NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];

        // transfer the old dictionary into the new dictionary
    [myMutableDictionaryaddEntriesFromDictionary:myDictionary];

        // Now add the data
    [myMutableDictionary setObject:myObject forKey:myKey];
...