确定何时解除UIMenuController?

Ben*_*ieb 15 iphone uimenucontroller

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

Mar*_*fer 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];
Run Code Online (Sandbox Code Playgroud)


Wil*_*iss 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];
}
Run Code Online (Sandbox Code Playgroud)

在我来说,我有上百个可选对象中,所以我不想让他们遵守本通知所有的时间!这种模式在获得firstResponder时会开始观察,resignFirstResponder在菜单被解除时触发,并以相同的方式结束观察.

在我的情况下(如在OP中),因为项目是不可编辑的,所以resignFirstResponder当菜单被解除时我需要打电话.这样,resignFirstResponder如果他们是否选择了其中一个菜单选项,则会调用它,因此清理代码将始终触发.