0

私はフォトギャラリーのように動作するアプリに取り組んでおり、ユーザーにギャラリーから写真を削除させるオプションを実装しています。これを実現するために、各画像の上に非表示のボタンを配置することにしました。ユーザーが「編集」ボタンを押すと、各画像の非表示の削除ボタンがアクティブになります。わかりやすくするために、非表示の各ボタンに同じIBOutletを使用しており、InterfaceBuilderで各ボタンに適切なタグを付けています。ユーザーが画像の上にあるボタンをタップすると、本当に画像を削除するかどうかを尋ねるアラートビューが表示されます。[はい]をクリックした場合は、removeObjectAtIndexを呼び出します。これが私が使用しているコードです:

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

編集:これは、ユーザーのカメラロールから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(@ "Array:%@、index:%d"、self.array、alertView.tag);を追加したとき removeAtIndexの直前に、コンソールに2012-04-03 18:39:39.066 AppName [1631:f803]配列:(null)、インデックス:0と表示されます。これが原因でしょうか。なぜそうなるのかわかりませんが、コードは問題ないように見えると思います。

4

2 に答える 2

3

アレイからイメージを削除することだけが必要な手順ではありません。コードは配列から画像を削除するのに正しいため、2 回目に画像が範囲外になりますが、ユーザーが存在しない画像を削除できないように、UI から画像を削除する必要もあります。

于 2012-04-03T23:51:32.150 に答える
2

このコードには多くの奇妙な点がありますが、問題はビューでスーパーを呼び出していないことだと思いますが、ビューは表示され、ビューは関数をロードしました。viewWillAppear メソッドは目的を果たさないため、削除します。

于 2012-04-04T00:29:34.880 に答える