Определить, когда UIMenuController уволен? - PullRequest
15 голосов
/ 07 сентября 2010

Есть ли способ определить, когда UIMenuController был закрыт?У меня есть (не редактируемая) текстовая область, которую я выделяю, когда вызывается меню, и я бы хотел отменить ее выделение, когда они либо выбирают элемент (легко), либо отменяют (не возможно?)

Ответы [ 3 ]

38 голосов
/ 15 сентября 2010

При изменении состояния UIMenuController отправляет уведомления в центр NSNotification по умолчанию. Вы можете подписаться на них, чтобы получать уведомления, когда система скрывает меню:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willHideEditMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didHideEditMenu:) name:UIMenuControllerDidHideMenuNotification object:nil];
10 голосов
/ 21 марта 2014

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

1 голос
/ 15 февраля 2018

Swift 3 & 4

NotificationCenter.default.addObserver(
   self,
   selector: #selector(self.didHideEditMenu),
   name: NSNotification.Name.UIMenuControllerDidHideMenu,
   object: nil)

NotificationCenter.default.addObserver(
   self,
   selector: #selector(self.willHideEditMenu),
   name: NSNotification.Name.UIMenuControllerWillHideMenu,
   object: nil)
...