Определите, когда 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 вызывается, если они выбирают один из параметров меню, или нет, поэтому код очистки всегда срабатывает.