2014-08-06 4 views
-2

У меня есть GestureRecognizer, настроенный в подвью для обнаружения двойных нажатий. Когда это произойдет, владелец ViewController должен представить новый ViewController. Кажется, это требует обратного указателя от представления к его контроллеру.Говоря с ViewController from View

Теперь, когда я ужасно ошибаюсь, плохой MVC и т. Д. Но для этого должен быть правильный дизайн. Обнаружить двойное нажатие в ViewController, а затем решить, какой subview, через значение event.view? Как-то кажется, что гораздо лучше иметь GestureRecognizer в подзаголовке. Что такое Best Practice здесь?

+1

Шаблон Делегат является стандартным подходом – Paulw11

+0

возможно дубликат [прошивкой: обращение UIGestureRecognisers в UI (Sub) Views] (http://stackoverflow.com/questions/6687232/ios-handling-of-uigesturerecognisers-in-uisubviews) – Paulw11

+1

Почему бы просто не использовать метод addTarget UIGestureRecognizer: действие: и установить первый контроллер как цель и действие - это метод, который устанавливает и представляет ваш второй viewCon Троллингист? –

ответ

0

Добавить делегатский протокол в представление, которое может сообщать при двойном нажатии, и иметь контроллер представления в соответствии с этим протоколом.

Пример

MyView.h:

@protocol MyViewDelegate; 

@interface MyView : UIView 

@property (nonatomic, weak) id <MyViewDelegate> delegate; 

// stuff here 

@end 

@protocol MyViewDelegate <NSObject> 

@optional 
-(void)myViewDidDoubleTap:(MyView *)myView; 

@end 

MyView.m:

-(void)doubleTap:(id)sender { // your double tap method called by the gesture recognizer 

    if ([[self delegate] respondsToSelector:@selector(myViewDidDoubleTap:)]) 
     [[self delegate] myViewDidDoubleTap:self]; 

} 

Затем в заголовке контроллера представления (или расширение класса, ваш выбор):

@interface MyViewController : UIViewController <MyViewDelegate> 

А где вы инициализировать представление в файле реализации:

MyView *myView = [[MyView alloc] init]; 
[myView setDelegate:self]; 
// do stuff here 

И, наконец, добавить метод делегата:

-(void)myViewDidDoubleTap:(UIView *)myView { 

    // show your view controller here 

} 
+0

Это о том, о чем я думал. Причина, по которой я сомневаюсь, заключается в том, что subview имеет несколько уровней вниз и не создается контроллером напрямую, а его супервидом, который создается * его * супервидом и т. Д. Так что я должен передать указатель контроллера вниз за счет нескольких уровней инициализаторов, сохраните их в представлениях, которые никогда не будут использовать его, чтобы они могли передавать его дальше, когда они создают подзаголовки и т. д. Неловко. Но я думаю, что так оно и есть. –

+0

Вы также можете опубликовать свое мнение о NSNotification, и заинтересованные объекты могут подписаться на это – Paulw11