17

有没有办法确定 UIMenuController 何时被解除?我有一个(不可编辑的)文本区域,我在弹出菜单时突出显示,当他们选择一个项目(简单)或取消(不可能?)时,我想取消突出显示它

4

4 回答 4

41

在状态更改时 UIMenuController 会将通知发布到默认的 NSNotification 中心。您可以订阅它们以在系统隐藏菜单时收到通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willHideEditMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didHideEditMenu:) name:UIMenuControllerDidHideMenuNotification object:nil];
于 2010-09-15T12:02:47.087 回答
10

基于@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如果他们是否选择菜单选项之一,就会被调用,因此清理代码将始终触发。

于 2014-03-21T09:02:24.957 回答
2

斯威夫特 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)
于 2018-02-15T19:33:47.850 回答
0

斯威夫特 5

NotificationCenter.default.addObserver(
        self,
        selector: #selector(willHideMenu),
        name: UIMenuController.willHideMenuNotification,
        object: nil)
于 2020-10-16T15:56:07.090 回答