#iphone #ios #uiview #first-responder #uimenucontroller
#iPhone #iOS #uiview #первый ответчик #uimenucontroller
Вопрос:
Я использую UIMenuController в пользовательском подклассе UIView. Это означает, что он может стать первым ответчиком и запрашивает его canPerformAction
при действии «удалить».
Я также хотел бы, чтобы супервизор этого представления (также пользовательский UIView) мог использовать контроллер меню, поэтому в этом супервизоре я пометил его как способный быть первым ответчиком и реализованный canPerformAction
для различных действий (в данном случае «копировать» и «вырезать»).
Вот в чем дело: когда я делаю меню видимым из (первого) вложенного представления, оно помещает в меню все три действия: удалить, скопировать и вырезать. В отладчике я вижу canBecomeFirstResponder
и canPerformAction
вызывается в обоих представлениях до появления меню.
Что здесь происходит? Почему контроллер меню не ограничен представлением, которое стало первым ответчиком? Или я неправильно диагностирую это?
Спасибо.
Ответ №1:
Какой код вы используете?
В документации для canPerformAction:withSender:,
Эта реализация этого метода по умолчанию возвращает YES, если класс-ответчик реализует запрошенное действие и вызывает следующий ответчик, если он этого не делает. … Обратите внимание, что если ваш класс возвращает NO для команды, другой ответчик, находящийся дальше по цепочке ответчиков, все равно может вернуть YES, включив команду.
Это кажется противоречивым, говоря, что реализация по умолчанию повторяет цепочку ответчиков, но также и то, что UIMenuController повторяет цепочку ответчиков, если вы возвращаете NO.
Вероятно, самая простая выдумка — переопределить -nextResponder
возврат nil, но это может иметь другие побочные эффекты (например, действия с целью «nil» по умолчанию идут вверх по цепочке ответчиков!).
Комментарии:
1. Что ж, это все объясняет. Спасибо. Я не понимал, что цепочка ответчиков используется именно таким образом. Похоже, достаточно просто просто обернуть
canPerformAction:withSender
логику в условное выражение, основанное на том, является ли это подпредставление активным или нет. Странно, но не слишком болезненно. Спасибо за указатель на это!