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 или каким-либо другим способом получить доступ к нему?

Спасибо

Брайан


person Brian Boyle    schedule 31.03.2012    source источник


Ответы (1)


Ты почти там. UIGestureRecognizer имеет свойство просмотра. Если вы выделите и прикрепите распознаватель жестов к каждому просмотру изображения - так же, как он выглядит во фрагменте кода - тогда ваш код жеста (на цели) может выглядеть следующим образом:

- (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];
}
person danh    schedule 31.03.2012
comment
Это блестяще. Бесконечно благодарен. Это сработало отлично! Хорошее решение. - person Brian Boyle; 01.04.2012