确定何时解除 UIMenuController?

Posted

技术标签:

【中文标题】确定何时解除 UIMenuController?【英文标题】:Determine when a UIMenuController is dismissed? 【发布时间】:2010-09-07 03:19:40 【问题描述】:

有没有办法确定 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];

在我的例子中,我有数百个可选择的对象,所以我不希望他们all一直观察这个通知!此模式在获得 firstResponder 时开始观察,在关闭菜单时触发 resignFirstResponder,并在同一时间结束观察。

在我的情况下(如在 OP 中),由于该项目是不可编辑的,因此我希望在关闭菜单时致电 resignFirstResponder。这样,resignFirstResponder 会在他们是否选择菜单选项之一时被调用,因此清理代码将始终触发。

【讨论】:

这正是我所需要的!【参考方案3】:

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)

【讨论】:

NSNotification.Name.UIMenuControllerWillHideMenu 和 NSNotification.Name.UIMenuControllerDidHideMenu 改为 UIMenuController.didHideMenuNotificationUIMenuController.willHideMenuNotification【参考方案4】:

斯威夫特 5

NotificationCenter.default.addObserver(
        self,
        selector: #selector(willHideMenu),
        name: UIMenuController.willHideMenuNotification,
        object: nil)

【讨论】:

以上是关于确定何时解除 UIMenuController?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定用户何时复制了文本

IOS UIMenuController UIMenuItem,如何确定使用通用选择器方法选择的项目

ipad 检测 UIPopoverController 何时被解除

检测 UIAlertController 何时被另一个 UIViewController 解除

UIMenuController 在呈现后立即被解雇

无法让 UIMenuController 显示自定义项目