UISearchBar показывает неправильные UIMenuItems из-за использования UIMenuController в другом месте приложения

У меня есть MyRootViewController, который представляет MyModalViewController модально при нажатии кнопки. MyModalViewController содержит UISearchBar, и я хочу, чтобы он отображал обычные текстовые параметры [Вырезать|Копировать|Вставить|Выбрать все] при длительном нажатии в текстовом поле.

MyRootViewController представляет пользовательский UIMenuItems (через UIMenuController) при длительном нажатии, поэтому переопределяет - (BOOL)canBecomeFirstResponder и - (BOOL)canPerformAction:(SEL)action withSender:(id)sender и реализует -(void)duplicate:(id)sender и -(void)delete:(id)sender.

Моя проблема заключается в том, что MyRootViewController спрашивают, какой UIMenuItems отображать для UISearchBar внутри MyModalViewController, когда пользователь долго нажимает внутри него и, следовательно, отображает ненужные элементы меню вместо обычных параметров [Вырезать | Копировать | Вставить | Выбрать все]. для текстового поля.

Насколько я понимаю, это происходит потому, что MyRootViewController все еще находится в цепочке респондентов, хотя в настоящее время он не виден.

Лучшее решение, которое я придумал до сих пор, — создать подкласс UISearchBar и переопределить - (BOOL)canPerformAction:(SEL)action withSender:(id)sender, возвращая YES для вырезания, копирования, вставки или выбора всего. Это останавливает iOS, идущую дальше по цепочке респондентов. Но это похоже на взлом — я не должен прибегать к этому только для того, чтобы заставить UISearchBar вести себя согласованно с остальной системой, только потому, что я использую UIMenuController в другом месте.

Кто-нибудь знает более технически правильное решение этой проблемы?


person Andrew Ebling    schedule 22.05.2014    source источник


Ответы (1)


Вы можете установить свойство menuItems для [UIMenuController sharedController] только при длительном нажатии. И устанавливайте его равным нулю всякий раз, когда выбрасывается UIMenuControllerWillHideNotification.

person Yatin Sarbalia    schedule 20.11.2015