web-dev-qa-db-ja.com

iOS-UITapGestureRecognizer-引数付きセレクター

私のアプリでは、実行時にビューに画像を動的に追加しています。画面に複数の画像を同時に表示できます。各画像はオブジェクトから読み込まれます。画像にtapGestureRecongnizerを追加して、タップしたときに適切なメソッドが呼び出されるようにしました。

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
    [plantImageView addGestureRecognizer:tapGesture];

私の問題は、どの画像をタップしたのかわからないことです。 tapGestureRecognizer.locationを呼び出して画面上の場所を取得できることは知っていますが、それは私にとってあまり良いことではありません。理想的には、画像が読み込まれたオブジェクトをタップジェスチャに渡すことができるようにしたいと思います。ただし、セレクター名「imageTapped:」のみを渡すことができ、引数は渡せないようです。

- (IBAction)imageTapped:(Plant *)plant
{
   [self performSegueWithIdentifier:@"viewPlantDetail" sender:plant];
}

オブジェクトを引数としてtapGestureRecongnizerに渡す方法、またはオブジェクトを処理する他の方法を知っている人はいますか?

ありがとう

ブライアン

15
Brian Boyle

もうすぐです。 UIGestureRecognizerにはviewプロパティがあります。ジェスチャレコグナイザーを各画像ビューに割り当ててアタッチすると(コードスニペットに表示されるのと同じように)、(ターゲット上の)ジェスチャコードは次のようになります。

- (void) imageTapped:(UITapGestureRecognizer *)gr {

  UIImageView *theTappedImageView = (UIImageView *)gr.view;
}

提供したコードからはっきりしないのは、Plantモデルオブジェクトを対応するimageViewに関連付ける方法ですが、次のようになります。

NSArray *myPlants;

for (i=0; i<myPlants.count; i++) {
    Plant *myPlant = [myPlants objectAtIndex:i];
    UIImage *image = [UIImage imageNamed:myPlant.imageName];  // or however you get an image from a plant
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];  // set frame, etc.

    // important bit here...
    imageView.tag = i + 32;

    [self.view addSubview:imageView];
}

これで、grコードはこれを実行できます。

- (void) imageTapped:(UITapGestureRecognizer *)gr {

  UIImageView *theTappedImageView = (UIImageView *)gr.view;
  NSInteger tag = theTappedImageView.tag;
  Plant *myPlant = [myPlants objectAtIndex:tag-32];
}
27
danh