Если вы посмотрите документацию UIResponder
, в описании сказано, что по умолчанию:
UIView реализует этот метод, возвращая объект UIViewController, который управляет им (если он есть) или его суперпредставлением (если его нет);
Если ваше представление не возвращает контроллер представления, тогда оно должно вернуть свое суперпредставление (как вы выяснили).
UIApplication на самом деле имеет метод, который должен точно обрабатывать этот вариант использования:
- (BOOL)sendAction:(SEL)action
to:(id)target
from:(id)sender
forEvent:(UIEvent *)event
Поскольку у вас нет ссылки на цель, вы можете продвигаться вверх по цепочке респондента, установив целевое значение равным nil
, так как согласно документации:
Если цель равна нулю, приложение отправляет сообщение первому респонденту, откуда оно переходит в цепочку респондента, пока оно не будет обработано.
Конечно, вы можете получить доступ к UIApplication с помощью метода класса [UIApplication sharedApplication]
Подробнее здесь: UIApplication Documents
Это лишнее, но если вам абсолютно необходим доступ к контроллеру представления, чтобы сделать что-то более сложное, вы можете перемещаться вверх по цепочке респондента вручную, пока не достигнете контроллера представления, вызывая метод nextResponder
, пока он не вернется контроллер представления. Например:
UIResponder *responder = self;
while ([responder isKindOfClass:[UIView class]])
responder = [responder nextResponder];
тогда вы можете просто привести его в качестве контроллера представления и продолжить делать с ним все, что вы хотели:
UIViewController *parentVC = (UIViewController *)responder