确定何时解除UIMenuController?

时间:2010-09-07 03:19:40

标签: iphone uimenucontroller

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

4 个答案:

答案 0 :(得分:38)

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willHideEditMenu:) name:UIMenuControllerWillHideMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didHideEditMenu:) name:UIMenuControllerDidHideMenuNotification object:nil];

答案 1 :(得分:10)

基于@MarkusMü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,因此清理代码将始终触发。

答案 2 :(得分:1)

Swift 3& 4

k8s-ig--foobar

答案 3 :(得分:0)

快捷键5

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