确定何时解除 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.didHideMenuNotification 和 UIMenuController.willHideMenuNotification【参考方案4】:斯威夫特 5
NotificationCenter.default.addObserver(
self,
selector: #selector(willHideMenu),
name: UIMenuController.willHideMenuNotification,
object: nil)
【讨论】:
以上是关于确定何时解除 UIMenuController?的主要内容,如果未能解决你的问题,请参考以下文章
IOS UIMenuController UIMenuItem,如何确定使用通用选择器方法选择的项目
ipad 检测 UIPopoverController 何时被解除