Итак, у меня есть контроллер представления, который имеет представление контейнера. Представление контейнера встроено в контроллер навигации, который также является родительским контроллером контроллера представления. Раскадровка такая:
контроллер представления (mainViewController
) --> контроллер навигации --> контроллер представления (contentViewController
)
Вы можете увидеть скриншот раскадровки ниже.
Первая стрелка — это переход от представления контейнера к контроллеру навигации. Вторая стрелка представляет собой связь, представляющую contentViewController
, является корневым контроллером представления контроллера навигации.
mainViewController
и contentViewController
являются объектами одного класса с именем testViewController
. Это подкласс UIViewController. Его реализация проста. У него только три метода IBAction
, больше ничего. Вот код реализации:
#import "TestViewController.h"
@implementation TestViewController
- (IBAction)buttonTapped:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"button is tapped"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
- (IBAction)barButtonTapped:(id)sender
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"bar button is tapped"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
- (IBAction)viewTapped:(id)sender {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:@"view is tapped"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
}
@end
Я добавил распознаватель жестов касания в представление контейнера в mainViewController
. Он отправляет viewTapped:(id)sender
сообщение mainViewController
при нажатии на представление контейнера. В корневом представлении contentViewController
есть кнопка, которая при нажатии отправляет сообщение buttonTapped:(id)sender
на contentViewController
. На панели инструментов contentViewController
есть кнопка, которая при нажатии отправляет barButtonTapped:(id)sender
сообщение contentViewController
. Начальная сцена mainViewController
. Когда приложение запущено, я обнаружил, что блокируются только события касания кнопки панели, событие касания правильно обрабатывается кнопкой. В документации Apple Регулирование доставки касаний к просмотрам, говорится:
В простом случае, когда происходит касание, объект касания передается из объекта UIApplication в объект UIWindow. Затем окно сначала отправляет касания любым распознавателям жестов, прикрепленным к представлению, в котором произошли касания (или к суперпредставлениям этого представления), прежде чем передать касание самому объекту представления.
Я думал сенсорное событие не пройдет на кнопку. Это действительно смутило меня. Может кто-нибудь объяснить такое поведение? Спасибо большое.
Скриншот раскадровки: