2012-04-03 4 views
0

Ich arbeite an einer App, die sich wie eine Fotogalerie verhält, und ich implementiere die Option, damit der Benutzer Fotos aus seiner Galerie löscht. Um dies zu erreichen, habe ich beschlossen, einen unsichtbaren Knopf über jedes Bild zu setzen. Wenn der Benutzer eine Schaltfläche "Bearbeiten" anklickt, werden die ausgeblendeten Schaltflächen zum Löschen über jedes Bild aktiv. Ich benutze zur Vereinfachung das gleiche IBOutlet über jedem der versteckten Schaltflächen, und ich habe jede Schaltfläche in Interface Builder entsprechend gekennzeichnet. Wenn der Benutzer auf die Schaltfläche über dem Bild klickt, wird eine Warnmeldung angezeigt, in der Sie gefragt werden, ob die Datei wirklich gelöscht werden soll. Wenn sie ja klicken, rufe ich removeObjectAtIndex auf. Hier ist der Code Ich verwende:iOS: Bild wird nicht aus Array gelöscht

- (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"]; 
} 

Das Problem hier ist, dass wenn ich „Ja“ in der Alarmansicht klicken, passiert nichts. Wenn ich jedoch auf das Bild klicke und ein zweites Mal auf "Ja" klicke, stürzt die App ab und der Debug-Status lautet: Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSRangeException', Grund: '- [__ NSCFArray removeObjectAtIndex:]: index (0) beyond bounds (0) ' Also ich bin mir nicht sicher, wohin ich von hier aus gehen soll, ich bin noch sehr neu im Programmieren und alles sieht für mich korrekt aus. Jede Hilfe wird sehr geschätzt, danke!

Hier ist, wie ich sie in das Array hinzufügen:

////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: Dies ist der Code, den ich verwende, um die Objekte in die UIImageView vom Benutzer Kamerarolle zu setzen:

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

} 

Wenn ich NSLog hinzugefügt habe (@ "Array:% @, Index:% d", self.array, alertView.tag); kurz vor removeAtIndex sagt die Konsole 2012-04-03 18: 39: 39.066 AppName [1631: f803] Array: (Null), Index: 0. Könnte das die Ursache sein? Ich bin nicht sicher, warum es so sein würde, ich denke, der Code sieht gut aus.

+1

Es scheint, dass Ihr Array leer ist. Zeigen Sie, wo Sie die Objekte hinzugefügt haben. – borrrden

+1

Können Sie Werte direkt vor removeObjectAtIndex :? ... etwas wie 'NSLog (@" Array:% @, Index:% d ", self.array, alertView.tag);' –

+0

@borrrden sicher, ich poste den Großteil meines Codes aus der Datei. – John

Antwort

2

Es gibt viele Kuriositäten mit diesem Code, aber ich denke, das Problem ist, dass Sie nicht super auf Ihre viewwillappear und viewdidload Funktionen aufrufen. Ich würde Ihre viewWillAppear-Methode loswerden, da sie keinen Zweck erfüllt.

+0

In Ordnung danke. Ich löschte viewWillAppear und fügte '[super viewDidLoad]' in viewDidLoad hinzu. Das Problem tritt jedoch immer noch auf. Wenn ich NSLog hinzugefügt habe (@ "Array:% @, Index:% d", self.Array, alertView.tag); 'kurz vor removeAtIndex sagt die Konsole 2012-04-03 18: 39: 39.066 AppName [1631: f803] Array: (null), index: 0. Könnte das der Grund sein? Ich bin nicht sicher, warum es so sein würde, ich denke, der Code sieht gut aus. – John

+1

wahrscheinlich, weil Sie sie nie hinzufügen, wenn die App in den Ruhezustand geht. Woher sollen sie kommen? – borrrden

+0

Der Benutzer zeigt sie von ihrer Kamerarolle an, ich werde den Code posten, den ich dafür im OP verwende. – John

3

Das Entfernen des Bildes aus dem Array ist nicht der einzige Schritt, den Sie unternehmen müssen. Ihr Code ist korrekt, um das Bild aus dem Array zu entfernen. Daher erhalten Sie das Bild zum zweiten Mal außerhalb der Grenzen, aber Sie müssen das Bild auch von der Benutzeroberfläche entfernen, damit der Benutzer ein nicht mehr vorhandenes Bild nicht mehr löschen kann.

+0

Ah okay das macht Sinn, danke. Wie würde ich das Bild von der Benutzeroberfläche entfernen? Entschuldigung für die Anfängerfragen. – John