touchesBegan и другие сенсорные события, не обнаруживаемые в UINavigationController - PullRequest
1 голос
/ 14 июня 2010

Короче говоря, я хочу обнаружить прикосновение к заголовку заголовка контроллера навигации, но у меня возникают проблемы с тем, чтобы вообще перехватить любые прикосновения!

Все делается без IB, если это имеет значение.

Файл .m моего делегата приложения содержит:

MyViewController *viewController = [[MyViewController alloc] init];
navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[window addSubview:navigationController.view];

В это окно добавлено несколько других подпредставлений, которые перекрывают навигационный контроллер, оставляя видимой только панель навигации.

MyViewController является подклассом UIViewController, и его файл .m содержит:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
 for (UITouch *touch in touches) {
  NSLog(@"ended\n");
 } 

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 for (UITouch *touch in touches) {
  NSLog(@"began\n");
 } 
}

Я также пытался поместить эти функции непосредственно в файл .m делегата приложения, но консоль остается пустой.

Что я делаю не так?

Ответы [ 5 ]

7 голосов
/ 14 июня 2010

Что ж, из-за отсутствия лучшей идеи я добавил еще одно подпредставление в свое приложение, прозрачное в цвете, расположенное программно над заголовком панели навигации и использовало пользовательский класс для этого представления с переопределенными соответствующими сенсорными методами.Работает нормально, но мне все еще хотелось бы найти более элегантное решение.

5 голосов
/ 14 июня 2010

Контроллер представления вставляется в цепочку респондента между его управляемым представлением и суперпредставлением:

Поскольку контроллеры представлений тесно связаны с представлениями, которыми они управляют, они также являются частью цепочки респондентов, используемой для обработки событий. Контроллеры представления сами являются потомками класса UIResponder и вставляются в цепочку респондента между управляемым представлением и его суперпредставлением. Таким образом, если представление, управляемое контроллером представления, не обрабатывает событие, оно передает событие своему контроллеру представления, который затем может обработать событие или переслать его в суперпредставление представления.

(документация UIViewController )

Возможно ли, что управляемое представление вашего контроллера поглощает все события? Что это за вид?

4 голосов
/ 22 июня 2012

У меня были проблемы с этим, так как мое пользовательское представление было глубже в иерархии представлений. Вместо этого я лазил по цепочке респондента, пока не нашел UIViewController;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // Pass to top of chain
    UIResponder *responder = self;
    while (responder.nextResponder != nil){
        responder = responder.nextResponder;
        if ([responder isKindOfClass:[UIViewController class]]) {
            // Got ViewController
            break;
        }
    }
    [responder touchesBegan:touches withEvent:event];
}
2 голосов
/ 25 апреля 2012

попробуйте добавить метод userInteractionEnabled = YES в ваш UIImageView

0 голосов
/ 14 июня 2010

Эти методы должны быть помещены в подкласс UIView, а не в UIViewControllers ... UIView получит обратные вызовы touch, затем вы можете создать протокол на UIView и реализовать его на UIViewController, чтобы UIViewController получал некоторый обратный вызовкогда происходят события касания ... Вот ссылка, которая говорит о протоколах и о том, как определить их и реализовать их Протоколы Ref

...