2012-04-05 4 views
0

Я сохранил изображения в NSMutableArray, и теперь я пытаюсь заставить их отображаться в viewDidLoad. Я попытался вызвать initWithContentsOfFile, но это не работает. Вот как выглядит код: imageView.image = [[UIImage alloc] initWithContentsOfFile:[self.array objectAtIndex:0]];-initWithContentsOfFile: для NSMutableArray

Я не уверен, что я должен использовать вместо initWithContentsOfFile иметь сохраненную нагрузку изображения, я даже не уверен, если я могу сохранять изображения в PLIST через пользовательские настройки. Я уже некоторое время изучаю его, но безрезультатно. Любая помощь очень ценится, спасибо!

EDIT: Вот дополнительный код:

- (IBAction)grabImage { 
    self.imgPicker = [[UIImagePickerController alloc] init]; 
    self.imgPicker.delegate = self; 
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 

    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     _popover = [[UIPopoverController alloc] initWithContentViewController:imgPicker]; 
     [_popover presentPopoverFromRect:self.imageView.bounds inView:self.imageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 

    else { 
     [self presentModalViewController:imgPicker animated:YES]; 
    } 
    [self.imgPicker resignFirstResponder]; 
} 
// Sets the image in the UIImageView 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo { 
    if (imageView.image == nil) { 
     imageView.image = img; 

     [self.array addObject:imageView.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 

    } 

    if (imageView2.image == nil) { 
     imageView2.image = img; 
     NSLog(@"The image is a %@", imageView); 
     [self.array addObject:imageView2.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

    if (imageView3.image == nil) { 
     imageView3.image = img; 

     [self.array addObject:imageView3.image]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 
} 

- (void)applicationDidEnterBackground:(UIApplication*)application { 
    NSLog(@"Image on didenterbackground: %@", imageView); 

    [self.array addObject:imageView.image]; 
    [self.array addObject:imageView2.image]; 
    [self.array addObject:imageView3.image]; 


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

      } 

- (void)viewDidLoad 
    { 
     self.user = [NSUserDefaults standardUserDefaults]; 
     NSLog(@"It is %@", self.user); 
     self.array = [[self.user objectForKey:@"images"]mutableCopy]; 
     imageView.image = [[UIImage alloc] initWithContentsOfFile:[self.array objectAtIndex:0]]; 
     imageView2.image = [[UIImage alloc] initWithContentsOfFile:[self.array objectAtIndex:1]]; 
     imageView3.image = [[UIImage alloc] initWithContentsOfFile:[self.array objectAtIndex:2]]; 




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

     backToGalleryButton.hidden = YES; 
     tapToDeleteLabel.hidden = YES; 
     deleteButton1.hidden = YES; 
     [super viewDidLoad]; 

    } 

EDIT: Это, как я мечения изображения и удалять их на основе их тегов:

- (IBAction)deleteButtonPressed:(id)sender { 
    NSLog(@"Sender is %@", sender); 
    UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:@"Delete" 
                   message:@"Are you sure you want to delete this photo?" 
                  delegate:self 
                cancelButtonTitle:@"No" 
                otherButtonTitles:@"Yes", nil]; 
    [deleteAlertView show]; 

    int imageIndex = ((UIButton *)sender).tag; 
    deleteAlertView.tag = imageIndex; 
} 

- (UIImageView *)viewForTag:(NSInteger)tag { 
    UIImageView *found = nil; 
    for (UIImageView *view in self.array) { 
     if (tag == view.tag) { 
      found = view; 
      break; 
     } 
    } 
    return found; 
} 

- (void)alertView: (UIAlertView *) alertView 
clickedButtonAtIndex: (NSInteger) buttonIndex 
{ 


    if (buttonIndex != [alertView cancelButtonIndex]) { 
     NSLog(@"User Clicked Yes. Deleting index %d of %d", alertView.tag, [array count]); 
     NSLog(@"The tag is %i", alertView.tag); 

     UIImageView *view = [self viewForTag:alertView.tag]; 
     if (view) { 
      [self.array removeObject:view]; 
     } 

     NSLog(@"After deleting item, array count = %d", [array count]); 
    NSLog(@"Returned view is :%@, in view: %@", [self.view viewWithTag:alertView.tag], self.view); 
     ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil; 
    } 

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

Вы попали в аварию? Что сообщение об ошибке? – joerick

+0

@joerick Нет, сэр, я не попал в аварию. Но изображения не сохраняются и не загружаются правильно, когда я закрываю приложение (в панели многозадачности) и перезапускают приложение. У меня такое чувство, что initWithContentsOfFile является виновником. – John

+0

Что на самом деле хранится в массиве? Путь? URL? Если он просто хранит экземпляр UIImage, вы не можете использовать initWithContentsOfFile ... – Daniel

ответ

2

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

+0

Я делал это раньше, но мне нужно пометить изображения. NSData не имеет свойств тега, которые я могу проверить. – John

+0

Как вы отметили изображения? Я ничего не видел в вашем коде. – rdelmar

+0

Я помечаю их в построителе интерфейса (чтобы позволить пользователю удалять изображения, если они захотят). Я просто обновил свой OP кодом, который я использую для этого. – John

0

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

Действительно, вы не должны называть initWithContentsOfFile: в этом случае, потому что UIImageView: image свойство сохраняет изображение, если вы его установили. Это обычно приводит к утечке памяти (если вы не используете автоматический подсчет ссылок). Вместо этого используйте один из статических инициализаторов, например imageNamed:, который имеет дополнительные бонусы использования системного кеша, а также автоматически загружает правильную версию изображения на основе характеристик устройства (например, он будет загружать вариант с более высоким разрешением изображения, если устройство имеет сетчатый дисплей).

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