Определите, когда UIMenuController уволен?
Есть ли способ определить, когда UIMenuController был уволен? У меня есть (не редактируемая) область текста, которую я выделяю, когда отображается меню, и я хотел бы выделить ее, когда они либо выбирают элемент (легко), либо отменяют (не возможно?)
Ответы
Ответ 1
В случае изменений состояния UIMenuController отправляет уведомления в центр NSNotification по умолчанию. Вы можете подписаться на них, чтобы получать уведомления, когда система скрывает меню:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willHideEditMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didHideEditMenu:) name:UIMenuControllerDidHideMenuNotification object:nil];
Ответ 2
Основываясь на предложении @Markus Müller, вот шаблон, который вы можете скопировать:
- (BOOL)becomeFirstResponder
{
// starts listening for UIMenuControllerDidHideMenuNotification & triggers resignFirstResponder if received
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resignFirstResponder) name:UIMenuControllerDidHideMenuNotification object:nil];
return [super becomeFirstResponder];
}
- (BOOL)resignFirstResponder
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];
// your custom cleanup code here (e.g. deselection)
return [super resignFirstResponder];
}
В моем случае у меня есть сотни выбираемых объектов, поэтому я не хотел, чтобы все они наблюдали это уведомление все время! Что этот шаблон начинает наблюдать, когда он получает firstResponder, запускает resignFirstResponder
, когда меню отклоняется, и заканчивается наблюдение в том же самом.
В моем случае (как и в OP), поскольку элемент является недействительным, мне желательно позвонить resignFirstResponder
, когда меню отклонено. Таким образом, resignFirstResponder
вызывается, если они выбирают один из параметров меню, или нет, поэтому код очистки всегда срабатывает.