有没有办法确定 UIMenuController 何时被解除?我有一个(不可编辑的)文本区域,我在弹出菜单时突出显示,当他们选择一个项目(简单)或取消(不可能?)时,我想取消突出显示它
问问题
6736 次
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 回答