2012-04-03 3 views
0

Я работаю над приложением, которое ведет себя как фотогалерея, и я реализую вариант, когда пользователь удаляет фотографии из своей галереи. Для этого я решил разместить невидимую кнопку над каждой картинкой. Когда пользователь нажимает кнопку «Изменить», кнопки скрытого удаления по каждому изображению становятся активными. Я использую один и тот же IBOutlet по каждой из скрытых кнопок для простоты, и я соответствующим образом пометил каждую кнопку в Interface Builder. Когда пользователь нажимает кнопку над изображением, появляется предупреждение, спрашивающее, действительно ли они хотят его удалить. Если они нажмут да, я вызываю removeObjectAtIndex. Вот код, я использую:iOS: Изображение не будет удалено из массива

- (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; 

} 

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


    if (buttonIndex != [alertView cancelButtonIndex]) { 
     NSLog(@"User Clicked Yes."); 
     [self.array removeObjectAtIndex: alertView.tag]; 
    } 
    [self.user setObject:array forKey:@"images"]; 
} 

Проблема здесь в том, что, когда я нажимаю «Да» в предупредительном зрении, ничего не происходит. Однако, если я коснусь изображения и снова нажмите «Да», приложение выйдет из строя, а состояния отладки: Завершение приложения из-за неотображенного исключения «NSRangeException», причина: '- [__ NSCFArray removeObjectAtIndex:]: index (0) за пределами (0) ' Итак, я не уверен, куда идти отсюда, я все еще очень новичок в программировании, и все выглядит правильно для меня. Любая помощь очень ценится, спасибо!

Вот как я добавляю их в массив:

////start of saving//// 
- (void)viewWillAppear:(BOOL)animated 
{ 

    self.user = [NSUserDefaults standardUserDefaults]; 

    self.array = [[self.user objectForKey:@"images"]mutableCopy]; 
    while(self.array == nil) 
    { 
     [self.user setObject:[NSMutableArray arrayWithObject:@""] forKey:@"images"]; 
     self.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); 
    self.array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]]; 

    [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)]]; 
    [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)]]; 
     [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)]]; 
     [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView5.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] initWithData:[self.array objectAtIndex:0]]; 
     imageView2.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:1]]; 
     imageView3.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:2]]; 
     imageView4.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:3]]; 
     imageView5.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:4]]; 
     imageView6.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:5]]; 


     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]; 

    } 

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

////end of saving 



///// shows the hidden and invisible "delete" button over each photo. 
- (IBAction)editButtonPressed:(id)sender { 
    grabButton.hidden = YES; 
    editButton.hidden = YES; 
    backToGalleryButton.hidden = NO; 
    tapToDeleteLabel.hidden = NO; 
    deleteButton1.hidden = NO; 
} 


- (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; 

} 

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


    if (buttonIndex != [alertView cancelButtonIndex]) { 
     NSLog(@"User Clicked Yes."); 
     NSLog(@"Array: %@, index: %d", self.array, alertView.tag); 
     [self.array removeObjectAtIndex: alertView.tag]; 
    } 
    [self.user setObject:array forKey:@"images"]; 
} 
@end 

EDIT: Это код, я использую, чтобы поместить объекты в UIImageView из рулона пользователи камеры:

- (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; 
     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 

    } 

    if (imageView2.image == nil) { 
     imageView2.image = img; 
     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

    if (imageView3.image == nil) { 
     imageView3.image = img; 
     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

    if (imageView4.image == nil) { 
     imageView4.image = img; 
     [picker dismissModalViewControllerAnimated:YES]; 
     [self.popover dismissPopoverAnimated:YES]; 
     return; 
    } 

} 

Когда я добавил NSLog (@ "Массив:% @, index:% d", self.array, alertView.tag); как раз перед removeAtIndex консоль говорит 2012-04-03 18: 39: 39.066 AppName [1631: f803] Массив: (null), index: 0. Может ли это быть причиной? Я не уверен, почему это было бы, я думаю, что код выглядит хорошо.

+1

Оказывается, ваш массив пуст. Покажите, где вы добавили к нему объекты. – borrrden

+1

Можете ли вы распечатать значения непосредственно перед removeObjectAtIndex :? ... что-то вроде 'NSLog (@" Array:% @, index:% d ", self.array, alertView.tag);' –

+0

@borrrden конечно, я выложу большую часть своего кода из файла. – John

ответ

2

Есть много странностей с этим кодом, но я думаю, проблема заключается в том, что вы не вызываете супер на свои функции viewwillappear и viewdidload. Я бы избавился от вашего метода viewWillAppear, поскольку он не имеет никакой цели.

+0

Хорошо, спасибо. Я удалил viewWillAppear и добавил '[super viewDidLoad]' в viewDidLoad. Однако этот вопрос все еще имеет место. Когда я добавил 'NSLog (@" Array:% @, index:% d ", self.array, alertView.tag); 'перед удалениемAtIndex консоль говорит 2012-04-03 18: 39: 39.066 AppName [1631: f803] Массив: (null), index: 0. Может ли это быть причиной? Я не уверен, почему это было бы, я думаю, что код выглядит хорошо. – John

+1

, вероятно, потому, что вы никогда не добавляете их, если приложение не заснет. где они должны появиться от – borrrden

+0

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

3

Удаление изображения из массива - это не единственный шаг, который вы должны предпринять. Ваш код правильный для удаления изображения из массива, поэтому вы получаете изображение за пределами границ во второй раз, но вам также нужно удалить изображение из пользовательского интерфейса, чтобы пользователь больше не мог удалять изображение, которого там нет.

+0

Ну ладно, что имеет смысл, спасибо. Как я могу удалить изображение из пользовательского интерфейса? Извините за новички. – John