2015-05-30 5 views
0

Я использую приведенный ниже код, чтобы сохранить int и некоторые другие вещи в NSUserDefaults из моего AppDelegate. Другой массив, который я сохраняю, полон объектами, которые соответствуют NSCoding, поэтому я не думаю, что это проблема. Если текущее место не равно нулю, это означает, что выполняется сеанс, поэтому все данные загружаются. При сохранении моих данных он сохраняет только в том случае, если текущее место не равно нулю, что указывает на то, что выполняется сеанс. Я знаю, что это вызывает, когда я выхожу из приложения на своем физическом устройстве, потому что сообщение NSLog появляется в отладчике.Проблемы с сохранением int в NSUserDefaults iOS

- (void)applicationDidEnterBackground:(UIApplication *)application { 
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 

if (self.currentPlace != 0) { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableArray *arr = self.places; // set value 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
    [defaults setObject:data forKey:@"places"]; 
    [defaults setInteger:self.currentPlace forKey:@"current"]; 
    NSLog(@"Saving and Quitting b/c we have a place verified!"); 
    [defaults synchronize]; 
} 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application { 
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

NSInteger myInt = [defaults integerForKey:@"current"]; 

self.currentPlace = (int)myInt; 

if (self.currentPlace != 0) { 
    NSData *data = [defaults objectForKey:@"places"]; 
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    self.places = [arr mutableCopy]; 
    NSLog(@"Current Place: %i",self.currentPlace); 
} 

} 

Я использую свой AppDelegate для хранения данных, к которым можно получить доступ с нескольких экранов в моем приложении. В первом ViewController пользователю предоставляется меню. Если значение currnentPlace приложения appDelegate равно , а не 0, то предоставляется возможность продолжить загрузку данных из AppDelegate. Однако этот вариант никогда не представлен. Я проверяю значение в currentPlace INT, используя следующие в моем первом контроллере представления:

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

// Do any additional setup after loading the view, typically from a nib. 
[self setupViews]; 
self.spinner.alpha = 0; 
NSLog(@"Current %i",delegate.currentPlace); 

if (delegate.currentPlace == 0) { 
    self.continueButton.enabled = false; 
    self.continueButton.alpha = 0.5; 
} 
else if (delegate.currentPlace != 0) { 
    self.continueButton.enabled = true; 
    self.continueButton.alpha = 1; 
} 

Если кто-нибудь мог видеть, что я делаю неправильно, это было бы весьма признателен.

+0

Какое значение вы получаете при регистрации этого NSLog (@ «Current% i», delegate.currentPlace); – iYoung

+0

Я не уверен, потому что приложение отключено от сеанса отладки Xcode, когда я вручную выхожу из него, дважды щелкнув кнопку «домой» и перевернув вверх –

+0

Но когда я просто нажимаю кнопку «домой» один раз и возвращаюсь во все, что хорошо, а в текущем месте правильно загружается –

ответ

1

Переместите блок кода восстановления данных в метод, как показано ниже:

- (void)restoreData { 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     NSInteger myInt = [defaults integerForKey:@"current"]; 

     self.currentPlace = (int)myInt; 

     if (self.currentPlace != 0) { 
     NSData *data = [defaults objectForKey:@"places"]; 
     NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
     self.places = [arr mutableCopy]; 
     NSLog(@"Current Place: %i",self.currentPlace); 
     } 
    } 

Затем этот метод вызывается в application:didFinishLaunchingWithOptions: и applicationWillEnterForeground: методов в AppDelegate.

+0

Это тот! Спасибо! –

1

Вы должны использовать

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

в вас контроллер, в котором вы делаете объект класса AppDelegate.

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

+0

Я попробую это позже. Благодарю. –