iOS: NSUserDefaults и UIImageViews - PullRequest
       15

iOS: NSUserDefaults и UIImageViews

0 голосов
/ 01 апреля 2012

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

- (void)viewWillAppear:(BOOL)animated
{

    self.user = [NSUserDefaults standardUserDefaults];

    NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
    while(array == nil)
    {
        [self.user setObject:[NSMutableArray arrayWithObject:@""] forKey:@"images"];
        array = [[self.user objectForKey:@"images"]mutableCopy];
        NSLog(@"%@",@"attempting to create an array to store the images in");
    }

}

- (void)applicationDidEnterBackground:(UIApplication*)application {
    NSLog(@"Image on didenterbackground: %@", imageView);
    NSMutableArray* array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]];

    [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)]];
     [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)]];
      [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)]];
       [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView5.image)]];
        [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView6.image)]];
         [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView7.image)]];
          [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView8.image)]];
           [array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView9.image)]];

            [self.user setObject:array forKey:@"images"];

            }

- (void)viewDidLoad
    {
        NSMutableArray* array = [[self.user objectForKey:@"images"]mutableCopy];
        imageView.image = [[UIImage alloc] initWithData:[array objectAtIndex:0]];
        imageView2.image = [[UIImage alloc] initWithData:[array objectAtIndex:1]];
        imageView3.image = [[UIImage alloc] initWithData:[array objectAtIndex:2]];
        imageView4.image = [[UIImage alloc] initWithData:[array objectAtIndex:3]];
        imageView5.image = [[UIImage alloc] initWithData:[array objectAtIndex:4]];
        imageView6.image = [[UIImage alloc] initWithData:[array objectAtIndex:5]];
        imageView7.image = [[UIImage alloc] initWithData:[array objectAtIndex:6]];
        imageView8.image = [[UIImage alloc] initWithData:[array objectAtIndex:7]];
        imageView9.image = [[UIImage alloc] initWithData:[array objectAtIndex:8]];



        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(applicationDidEnterBackground:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:app];


        [super viewDidLoad];

    }

- (void)viewDidUnload
    {
        self.user = nil;
    }

Все выглядит хорошо для меня, поэтому я не могу понять, почему они не сохраняются / загружаются. Любая помощь очень ценится, спасибо!

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Вы присваиваете self.user в viewWillAppear, который вызывается после viewDidLoad.

Вы должны изменить viewDidLoad на:

-(void)viewDidLoad {
  self.user = [NSUserDefaults standardUserDefaults];
  // ... rest the same
1 голос
/ 01 апреля 2012

Я не фанат вашего подхода (используя NSUserDefaults для хранения потенциально больших данных). Тем не менее, попробуйте вызвать synchronize на NSUserDefaults, чтобы записать их в постоянное хранилище, прежде чем завершать applicationDidEnterBackground. Этот метод обычно вызывается с периодическими интервалами, когда ваше приложение работает, но, поскольку оно входит в фоновый режим, оно, вероятно, не будет вызываться автоматически.

...