Можно ли одновременно получать вызовы UITapGestureRecognizer в 2 классах

Я хочу вызвать действие в двух классах (суперпредставление и полноэкранное подпредставление), когда пользователь один раз нажимает на экран. Но когда я добавляю UITapGestureRecognizer в подпредставление, тот, который добавлен в суперпредставление, переопределяется. Можно ли добавить UITapGestureRecognizer в подпредставление без переопределения UITapGestureRecognizer, добавленного в суперпредставление? Если да, то как я могу это сделать?

Спасибо!

Редактировать: из моего основного контроллера представления "MyToolBerController" я добавляю подпредставление из другого контроллера представления следующим образом:

PhotoViewController *photoViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
myPhotoView = photoViewController.view;
[self.view addSubview:myPhotoView]; 

Я добавляю GestureRecognizer в MyToolBerController следующим образом:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapFrom:)];        
[singleTap setNumberOfTapsRequired:1];
singleTap.delegate = self;
[myPhotoView addGestureRecognizer:singleTap];
[singleTap release];

Все это прекрасно работает, но мне нужно вызвать метод в классе PhotoViewController при касании представления, а также в классе MyToolBerController. Когда я добавляю еще один UITapGestureRecognizer в photoViewController, он переопределяет UITapGestureRecognizer, добавленный в superView.


person Jonah    schedule 08.07.2010    source источник


Ответы (2)


В методе выбора распознавателя жестов передайте информацию в подпредставление. Нет необходимости иметь несколько распознавателей жестов для одного и того же жеста. Что-то типа:

- (IBAction)handleSingleDoubleTap:(UIGestureRecognizer *)sender
{
    CGPoint tapPoint = [sender locationInView:sender.view.superview];
    UIView *subview = [parentView viewWithTag:100];
    [subview doSomethingWithPoint:tapPoint];
}

Это, конечно, означает, что вашему подпредставлению, которое необходимо уведомить, должен быть присвоен тег 100 либо в Интерфейсном Разработчике, либо в коде при загрузке контроллера представления.

Обновление на основе кода Ионы:

Поэтому вместо сохранения представления сохраните контроллер представления:

PhotoViewController *photoViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
self.myPhotoViewController = photoViewController;

Это означает, что вам нужно объявить его таким образом в заголовке MyToolbarController:

@property (nonatomic, retain) PhotoViewController *myPhotoViewController;

Затем, когда вызывается ваш селектор жестов, передайте сообщение сохраненному контроллеру представления. Что-то типа:

- (IBAction)handleSingleTapFrom:(UIGestureRecognizer *)sender
{
    CGPoint tapPoint = [sender locationInView:sender.view.superview];
    [myPhotoViewController doSomethingWithPoint:tapPoint];
}

Конечно, метод -doSomethingWithPoint: только для примера. Вы можете назвать и создать любой метод, который вы хотите, который принимает любой параметр, который вы хотите передать в свой PhotoViewController.

Дайте мне знать, если вам нужны дополнительные разъяснения.

person Matt Long    schedule 08.07.2010
comment
Спасибо за помощь! К сожалению, я как бы нарушаю правила, добавляя представление uiviewcontroller в качестве подпредставления. Второй UIGestureRecognizer добавляется в новый UIViewController. Я хотел бы использовать метод pushViewController, но мне нужно, чтобы просмотр занимал только часть экрана. Будет ли это работать? - person Jonah; 09.07.2010
comment
Пока вы можете получить представление или его контроллер представления с помощью указателя, вы можете отправлять ему сообщения, на которые оно может отвечать. Вы не нарушаете правила. То, что ты делаешь, прекрасно. Ваш контроллер представления может быть делегатом, которому отправляется ваше сообщение, когда происходит жест. Это не обязательно должно быть само представление, если представление имеет контроллер представления. Суть представления controller состоит в том, чтобы обрабатывать сообщения, отправляемые в представление и из него. Просто сохраните свой контроллер представления для вторичного представления при его создании и передайте ему свои параметры в селекторе распознавателя жестов. - person Matt Long; 09.07.2010
comment
Это именно то, что мне нужно. Как я могу получить viewController с помощью указателя? Я экспериментировал с использованием @class myViewController, но не совсем уверен, как правильно его реализовать, и мне не удалось найти какой-либо пример кода, показывающий, как это сделать. Как бы вы порекомендовали это сделать? Спасибо за помощь! - person Jonah; 09.07.2010
comment
Проще всего объяснить с помощью кода. Можете ли вы обновить свой ответ и вставить код, показывающий, где вы создаете свой дополнительный контроллер представления, чье представление вы используете в качестве подпредставления? - person Matt Long; 09.07.2010
comment
Не проверял ответ Джейсона, но похоже, что это может быть путь меньшего сопротивления. Хотя я рад помочь вам лучше понять, как заставить ваши взгляды общаться друг с другом. - person Matt Long; 09.07.2010

Распознаватель жестов может отправлять несколько действий при выполнении жеста. Вы можете добавить подпредставление в качестве еще одной цели распознавателя жестов и использовать только один экземпляр UITapGestureRecognizer:

[tapRecognizer addTarget:theSubview action:@selector(whatever:)];
person Jason Foreman    schedule 08.07.2010