1

私はいくつかのボタンを持っています。いずれかのボタンを押すとポップアップし、alertView がユーザーに写真を撮るか、カメラ ロールから選択するように求めます。今私が抱えている問題は、12 個のボタンと 12 個の UIImageView があることです。すべてのボタンには、アラートをポップし、ユーザーがいずれかのオプションを選択できるようにする独自のアクションがあります。didFinishPickingMediaWithInfo メソッドで、カメラまたはカメラ ロールから最初の imageView に画像を渡します。これはすべて正常に動作しますが、別のタグで別のアラートを発生させるボタン 2 を選択したい場合は、imageView 2 などを設定します (imageView1 を置き換えません)。アラートをポップしたボタンの選択に基づいて、どの imageView を設定するかを didFinishPickingMediaWithInfo で区別する方法が必要です。

ボタンのアクションは次のとおりです。

-(IBAction) addPhoto1:(id) sender {

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Image Source" message:@"Take a photo or select a previously taken photo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Take Photo", @"Select Photo", nil];
    [alert show];
    alert.tag = 101;
    [alert release];

}

そしてアラートclickedButtonAtIndex

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

    if (alert.tag == 101) {

        if (buttonIndex == 1) {
            //Take photo
            [self performSelector:@selector(takePicture:) withObject:nil afterDelay:0.0];
        }
        else if (buttonIndex == 2){
            //Camera roll
            [self performSelector:@selector(pictureAlbum:) withObject:nil afterDelay:0.0];
        }
        else if (buttonIndex == 0) {
            NSLog(@"Cancel");
        }
    }
}

そして、ここにありますdidFinishPickingMediaWithInfo

-(void) imagePickerController:(UIImagePickerController *) picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{

    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

        UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];


        [library writeImageToSavedPhotosAlbum:[image CGImage] metadata:dict completionBlock:nil];


        if (addFirstImage.tag == 1001) {
            firstImage.image = [info objectForKey:UIImagePickerControllerOriginalImage];
           firstImage.layer.cornerRadius = 5;
           firstImage.layer.masksToBounds = YES;

        }
        if (addSecondImage.tag == 1002) {            
           secondImage.image = [info objectForKey:UIImagePickerControllerOriginalImage];
           secondImage.layer.cornerRadius = 5;
           secondImage.layer.masksToBounds = YES;

        }
    }
}

明らかに、最初に押されたアラートのボタンに基づいて正しい imageViews 画像を設定する最良の方法は何ですか? (addFirstImage と addSecondImage はどちらも IB 経由でリンクされたボタンです)

どうもありがとう

4

2 に答える 2

0

わかりました、これを行う方法を見つけました。最初に、インターフェースファイルに myTag という ivar int を作成しました

int myTag;

次に、viewDidLoad ですべてのボタンにタグ番号、つまり button1.tag = 1001 (12 個のボタンの場合は 1012) をタグ付けしました。

次に、ボタンごとに 12 ではなく、1 つのアクションを作成しました。そして、IB を介してすべてをこの 1 つのアクションに接続します。

- (IBAction)takePhoto:(UIButton*)sender {

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Image Source" message:@"Take a photo or select a previously taken photo" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Take Photo", @"Select Photo", nil];
[alert show];
alert.tag = 101;
[alert release];

if (sender.tag == 1001){

    NSLog(@"You clicked button 1");
    myTag = 1001;

}

if (sender.tag == 1002){

    NSLog(@"You clicked button 2");
    myTag = 1002;
}

}

次に、どのボタンが押されたかを検出し、int 値を myInt ivar に渡します。

そして、私の didFinishPickingMediaWithInfo でこれを行います!

if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];


    [library writeImageToSavedPhotosAlbum:[image CGImage] metadata:dict completionBlock:nil];

    if (myTag == 1001){


        firstImage.image = [info objectForKey:UIImagePickerControllerOriginalImage];
        firstImage.layer.cornerRadius = 5;
        firstImage.layer.masksToBounds = YES;

    }

    if (myTag == 1002) {
        secondImage.image = [info objectForKey:UIImagePickerControllerOriginalImage];
        secondImage.layer.cornerRadius = 5;
        secondImage.layer.masksToBounds = YES;
    }





    [picker dismissModalViewControllerAnimated:YES];

}

すべてが完璧に機能しています!あなたの助けに感謝します!

于 2012-07-23T22:23:05.633 に答える
0

アクションの「送信者」を使用して、どのボタンが最初に押されたかを「記憶」してみませんか? IBOutletCollections を使用して、同じインデックスで並べ替えます。

@property (...) IBOutletCollection(UIButton) allYourButtons;

@property (...) IBOutletCollection(UIImageView) allYourImageViews;
// I suppose that both Collections objects have 'tags' (set in XIB file)
// a UIButton and the corresponding UIImageVIew have the SAME tag

@property (...) NSInteger clickedButtonIndex;

- (IBAction) imageViewWasPressed:(id)sender
{
    //keep a reference to the specific button that launched the action
    self.clickedButtonIndex = [(UIButton *)sender tag]; 

    [self presentAlertViewForPictureChoice];
}

次に、デリゲート メソッドで使用clickedButtonIndexして、UIAlertViewどの UIImageVIew からallYourImageViewsイメージを更新する必要があるかを調べます...

- (UIImageView *)imageToUpdateForSelectedIndex:(NSInteger)anIndex
{
    UIImageView *result = nil;
    for (UIImageView *imageView in self.allYourImageViews){
        if(imageView.tag == anIndex){
             result = imageView;
            break;
        }
    }
    return result;

}

(編集) OK、UIButton を UIImageView に関連付ける別の方法は、サブクラスを作成することです

// a new UIButton subclass

ButtonWithImageView : UIButton

@property (...) IBOutlet UIImageView *relatedImageView;

//IBOutlet enables you to directly link a Button with its imageVIew in your XIB

// in your controller

@property (...) ButtonWithImageView *selectedButton;


- (IBAction)buttonWasPressed:(id)sender
{
    ...
    self.selectedButton = (ButtonWithImageView *)sender;

}

あとは編集するだけself.selectedButton.relatedImageView

于 2012-07-23T12:13:11.713 に答える