Възможно ли е да получавате обаждания на UITapGestureRecognizer в 2 класа едновременно

Искам да извикам действие в два класа (суперизглед и подизглед на цял екран), когато потребителят докосне еднократно екрана. Но когато добавя UITapGestureRecognizer към подизгледа, добавеният към суперизгледа се отменя. Възможно ли е да добавите UITapGestureRecognizer към подизглед, без да замените UITapGestureRecognizer, добавен към суперизгледа? Ако е така, как мога да направя това?

Благодаря!

Редактиране: От моя основен viewController „MyToolBerController“ добавям подизгледа от друг viewController, както следва:

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 или в Interface Builder, или в код, когато контролерът на изгледа се зареди.

Актуализация въз основа на кода на Йона:

Така че вместо да запазите изгледа, запазете контролера на изгледа:

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
Докато можете да хванете изгледа или неговия контролер за изглед с указател, можете да изпращате съобщения до него, на които той може да отговори. Не нарушаваш правилата. Това, което правиш, е добре. Вашият контролер за изглед може да бъде делегатът, до който се изпраща вашето съобщение, когато се появи жестът. Не е задължително да е самият изглед, ако изгледът има контролер за изглед. Това е целта на контролера да обработва съобщенията, изпратени до и от изгледа. Просто запазете своя контролер за изглед за вашия вторичен изглед, когато го създавате, и му предайте вашите параметри в селектора на разпознавателя на жестове. - 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