2011-07-06 2 views
2

Я пытаюсь реализовать функциональность «Добавить в избранное», используя NSMutableDictionary, поскольку мне нужно добавить несколько ключевых значений. Следующий метод addToFavourites всегда отображает Count = 0 даже после добавления объекта в словарь. Я прочитал this и получил nsdefaults в mutabledictionary (вместо изменяемого массива) и установил верный словарь обратно в nsdefaults, но не уверен, в чем проблема. Любая помощь могла бы быть полезна. Спасибо.iPhone: не удалось сохранить NSMutableDictionary в NSUserDefaults

Отредактировано: От this Я пришел к пониманию, что мне нужно перемещать данные вокруг изменяемого и неизменяемого словаря, а затем он отлично работает! но все еще не в состоянии синхронизировать модифицированный NSMutableDictionary с NSUserDefaults.

-(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 { 
NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1]; 
[myMutableDictionary addEntriesFromDictionary:myDictionary]; 
[myMutableDictionary setObject:myObject forKey:myKey]; 


// Modified dictionary is not getting synced 
[[NSUserDefaults standardUserDefaults] setObject:myMutableDictionary forKey:kFavouriteItemsKey]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Пробовал кодирование данных словаря в NSData, и теперь он работал после незначительных, но серьезных исправлений!

-(BOOL)isAddedToFavorites:(NSString*)viewID { 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:kFavouriteItemsKey]; 
NSDictionary *favourites = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

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

return NO; 
} 

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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:kFavouriteItemsKey]; 
NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1]; 
[myMutableDictionary addEntriesFromDictionary:myDictionary]; 
[myMutableDictionary setObject:viewType forKey:viewID]; 


NSData *newdata = [NSKeyedArchiver archivedDataWithRootObject:myMutableDictionary]; 
[[NSUserDefaults standardUserDefaults] setObject:newdata forKey:kFavouriteItemsKey]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Спасибо.

+1

Этот http://stackoverflow.com/questions/471830/why-nsuserdefaults-failed-to-save-nsmutabledictionary-in-iphone-sdk представляется дубликатом. Помогает ли это? – phi

+0

Это выглядит по-разному. AppleDeveloper хранит строки и все еще имеет проблему. – Joe

+0

@Irene: Я пробовал значения словаря кодировки, но все равно он не работает! См. Отредактированный вопрос! – applefreak

ответ

2

Вам нужно будет реализовать это для элементов в словаре:

элемент в словаре реализует

@interface CommentItem : NSObject<NSCoding> { 
    NSString *value; 
} 

Тогда в реализации CommentItem, предусматривает два метода:

-(void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:value forKey:@"Value"]; 
} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    self.value = [decoder decodeObjectForKey:@"Value"]; 
    return self; 
} 

Как было предложено по ссылке @Irene.

+0

Привет, ОскарМк, это было то, что я не понял. Я не знаю, как и когда эти методы будут рассмотрены? Это сработало для меня без этого, не знаю, почему? У меня небольшая проблема при попытке добавить второй ключ. Мой XCode подвешен! Не уверен, что это из-за этого, но пытается его решить. См. Мой полный код в редактируемом вопросе. Благодарю. – applefreak

+1

@AppleDeveloper вам понадобится только код выше, если объекты в nsdictionary еще не реализовали NSCoding, но если они сработали, они реализуют его. Эти методы будут вызваны для того, чтобы NSKeyedArchiver распаковывался и архивировался. –

+0

Фантастический! Большое спасибо OscarMk за то, что помогли мне полностью! Сейчас он работает отлично. Редактор XCode был виден, возможно, по какой-то другой причине. – applefreak