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.
Es scheint, dass Ihr Array leer ist. Zeigen Sie, wo Sie die Objekte hinzugefügt haben. – borrrden
Können Sie Werte direkt vor removeObjectAtIndex :? ... etwas wie 'NSLog (@" Array:% @, Index:% d ", self.array, alertView.tag);' –
@borrrden sicher, ich poste den Großteil meines Codes aus der Datei. – John