2012-01-16 1 views
2

Я пытаюсь сохранить некоторые значения из своего приложения, используя NSCoding. Я могу сохранить значение, но не могу его восстановить.NSCoding NSKeyedUnarchiver unarchiveObjectWithFile: return null

Вот где я заявляю, протокол:

@interface AddReminderEventViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource, NSCoding> 

Вот где я, отвечающей с протоколом:

-(void)encodeWithCoder:(NSCoder *)enCoder 
{ 
[enCoder encodeObject:self.eventRepeatDurationDate forKey:kEventRepeatDuration]; 
[enCoder encodeObject:self.eventIDsMutableArray  forKey:kEventIDsMutableArray]; 
[enCoder encodeObject:self.eventRepeatDurationString forKey:@"mytest"];} 

и здесь:

-(id)initWithCoder:(NSCoder *)decoder { 

if (self = [super init]){ 

    self.eventRepeatDurationDate = [[decoder decodeObjectForKey:kEventRepeatDuration] retain]; 
    self.eventIDsMutableArray = [[decoder decodeObjectForKey:kEventIDsMutableArray] retain]; 
    self.eventRepeatDurationString = [[decoder decodeObjectForKey:@"mytest"] retain];} return self; } 

и вот где я вызов методов для архивации и разборки:

[self saveDataToDisk]; 
    [self loadDataFromDisk]; 

и вот тела этих методов, и это NSLog содержание:

- (void)saveDataToDisk { 
NSString *reminderEventIDsPathString = @"~/Library/Application Support/ReminderIDs.archive";  
//reminderEventIDsPathString = @"~/Library/Application Support/ReminderIDs.archive"; 
reminderEventIDsPathString = [reminderEventIDsPathString stringByExpandingTildeInPath]; 
NSLog(@"WATCH1: reminderEventIDsPathString is %@", reminderEventIDsPathString); 

NSMutableDictionary *rootObject; 
rootObject = [NSMutableDictionary dictionary]; 

[rootObject setValue:eventRepeatDurationString forKey:@"mytest"]; 
NSLog(@"1rootObject IS %@", rootObject); 

[NSKeyedArchiver archiveRootObject:rootObject toFile:reminderEventIDsPathString];} 

reminderEventIDsPathString is /Users/tester/Library/Application Support/iPhone Simulator/5.0/Applications/E26D57DE-C4E1-4318-AEDD-7207F41010A9/Library/Application Support/ReminderIDs.archive 
2012-01-16 15:47:48.578 [29658:15503] 1rootObject IS {mytest = 7;} 

и вот Unarchiver код вместе с его содержимым NSLog:

- (void)loadDataFromDisk { 
NSString *testValue = [[NSString alloc] init]; 
NSString *reminderEventIDsPathString = @"~/Library/Application Support/ReminderIDs.archive";  
reminderEventIDsPathString = [reminderEventIDsPathString stringByExpandingTildeInPath]; 
NSLog(@"WATCH2: reminderEventIDsPathString is %@", reminderEventIDsPathString); 

NSMutableDictionary *rootObject; 
rootObject = [[NSKeyedUnarchiver unarchiveObjectWithFile:reminderEventIDsPathString] retain]; 

NSLog(@"2rootObject IS %@", rootObject); 

NSLog(@"WATCH3 - %@", [rootObject objectForKey:@"mytest" ]); 

if ([rootObject valueForKey:@"mytest"]) { 
    testValue = [rootObject valueForKey:@"mytest"]; 
    NSLog(@"WATCH: testValue is %@", testValue); } } 

2012-01-16 15:48:14.965 [29658:15503] WATCH2: reminderEventIDsPathString is /Users/tester/Library/Application Support/iPhone Simulator/5.0/Applications/E26D57DE-C4E1-4318-AEDD-7207F41010A9/Library/Application Support/ReminderIDs.archive 

2012-01-16 15:48:17.879 [29658:15503] 2rootObject IS (null) 

Что я упускаю, что я «Невозможно разобрать содержимое? Я просто сосредотачиваюсь на самых простых значениях в моих методах кодирования/декодера, просто чтобы проверить его, но я даже не могу заставить строку значение работать.

Благодаря

ответ

1

Путь, где вы сохраните и загрузите ваше напоминание неправильно. Возможно, заменить на это

NSString *reminderEventIDsPathString = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"ReminderIDs.archive"]; 
+0

Можете ли вы рассказать мне, что вы имеете в виду под «неправильным»? Я думал, что должен писать на путь библиотеки. Это неправильно? Кроме того, я вижу файл на этом пути, и в нем есть содержимое. Спасибо – Jazzmine

+0

Ну, это сработало! Большое вам спасибо, но я также благодарю вас за разъяснение, почему это сработало. Приложения не должны писать/читать с пути, который у меня был? Спасибо, что нашли время ответить. – Jazzmine

+0

Кроме того, если я хочу написать значение в одном контроллере представления и получить его в другом, должен ли я использовать/ссылаться на appDelegate для записи и чтения, чтобы избежать дублирования кода? Еще раз спасибо. – Jazzmine

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

  • Нет связанных вопросов^_^