0

私が書いているアプリのこのセクションで多くの問題が発生しています。ここの人々は私にうんざりしていると確信しているので、この投稿ですべての質問を解決しようと思います. 私はフォト ギャラリーのように動作するアプリに取り組んでおり、ユーザーがギャラリーから写真を削除するオプションを実装しています。これを実現するために、各画像の上に非表示のボタンを配置することにしました。ユーザーが「編集」ボタンを押すと、各画像の非表示の削除ボタンがアクティブになります。簡単にするために、非表示の各ボタンに同じ IBOutlet を使用し、Interface Builder で各ボタンに適切にタグを付けました。ユーザーが写真の上でボタンをタップすると、本当に削除するかどうかを尋ねるアラート ビューが表示されます。[はい] をクリックすると、removeObjectAtIndex を呼び出して、UI から画像を削除します。しかし、アラート ビューで [はい] をクリックすると、Xcode から次のようなエラーが表示されます。

2012-04-04 11:26:40.484 AppName[608:f803] -[UIButton setImage:]: 認識されないセレクターがインスタンス 0x6a922c0 に送信されました

2012-04-04 11:26:40.485 AppName[608:f803]キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[UIButton setImage:]: 認識されないセレクターがインスタンス 0x6a922c0 に送信されました' *

私はこれを数時間引き起こしている原因を突き止めようとしてきましたが、役に立ちませんでした。コードのどこにも UIButton の画像を設定していません。私は IB で行いましたが、ボタンの種類をカスタムに設定して、非表示にしました。以下にファイル全体を投稿します。コードに問題が見つからないので、助けていただければ幸いです。ありがとう。 編集コードの現在のバージョンは次のとおりです。

    - (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 = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(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:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)]];

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

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

        [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)]];

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

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

        [self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)]];

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

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Photo Gallery", @"Photo Gallery");
        self.tabBarItem.image = [UIImage imageNamed:@"42-photos.png"];
    }
    return self;
}
////start of saving////


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



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

    }




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

// This is when the user taps on the image to delete it.
- (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. Deleting index %d of %d", alertView.tag, [array count]);
        NSLog(@"The tag is %i", alertView.tag);
        [self.array removeObjectAtIndex: alertView.tag];
        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"];
}

更新: ブレークポイントを追加し、それ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil;がクラッシュの原因となっている行であることを発見しましたが、それでも理由はわかりません。

4

2 に答える 2

2

setImage:質問に貼り付けたコードのいずれかで呼び出されている ことはわかりませんが、これを伝えることができます:UIButtonsetImageメソッドは、実際には2番目のパラメーターとしてボタンの状態を必要とします。

例えば

[UIButton setImage: forState:]

Apple のドキュメントをリンクしました。

への呼び出しにsetImage:2 番目のパラメーターがない場合は、表示されている「認識されないセレクター エラー」が説明されます。

于 2012-04-04T17:42:09.637 に答える
1

これは @MichaelDautermann の拡張であり、UIButton には setImage:forState: メソッドがあるが、setImage メソッドがないことを非常によく指摘しています。ただし、設定イメージを呼び出しています。ボタンではなく、imageView.image と imageView2.image と言うと。これにより、画像ビューのセッター メソッドが呼び出されます。ブレークポイントを設定 (または NSLog と %@ アイテムを使用) して、imageView が実際にはボタンではなく imageView であることを確認します。それがあなたの下から何らかの形で変化した場合、これが問題を引き起こしている可能性があります. これらの 2 つの行にブレーク ポイントを設定し、それらを通過するかどうかを確認するだけです。

さらに、Xcode が実際に問題を引き起こしている行を表示しない場合は、クラッシュ ログを確認してください。記号化されたログは、行番号を示します。または、それほど直接的ではないアプローチは、回答で提供したメソッドの最後にブレークポイントを設定し、何回通過したかを確認することです。クラッシュしたら、問題の原因となっているメソッドを絞り込み、問題の行に到達するまでメソッド内にブレーク ポイントを設定し始めます。

更新: ((UIImageView *)[self.view viewWithTag:alertView.tag]).image =nil はあなたが持っているものですが、self.view は UIControl です。キャストを変更しても結果には影響しません。UIControl のサブビューを削除しようとしているイメージの UIImageView ですか? そうでない場合、viewWithTag から画像ビューを取得することはできません。一般に、self.view はビュー コントローラーのビューを参照するため、UIControl を取得している場合、ビュー全体が UIControl であるか、間違ったクラスでこれを行っていると思います。どのクラスでこれを行っていますか? また、それはどのクラスのサブクラスですか? ビューコントローラーでこれを行っているようですが、確認したいだけです。繰り返しますが、どちらの場合 (UIControl または UIImageView) も、どちらのクラスも setImage に応答しません。

于 2012-04-04T18:14:09.350 に答える