如何确定触发上下文菜单显示的内容

How to determine what triggers a context menu presentation

提问人:Victor Engel 提问时间:10/4/2023 最后编辑:Victor Engel 更新时间:10/9/2023 访问量:33

问:

我正在开发适用于 iPad 和 Mac Catalyst 的应用程序。我已经使用自定义撤消管理器实现了撤消。这样一来,项目中的每个图层都可以有一个单独的撤消管理器。我注意到,有时当我长按该键时,我会得到这个上下文菜单。COMMAND

enter image description here

我已经在所有作为响应者的对象中添加了验证函数,以确定触发它的原因,但我找不到它。在这种情况下,没有什么可撤消的,所以我真的需要禁用该命令。如何确定是什么触发了它?

我已将 validate 函数添加到所有 、 自定义视图、 控件子类 和 .这些都没有触发它。我应该能够通过在正确的对象中使用 validate 函数来禁用该命令,但是我如何确定它是哪个对象?我可以用一个象征性的断点来捕获一些东西吗?还有其他想法吗?我真的不希望出现这个上下文菜单。viewControllersappDelegatesceneDelegateUIResponder

一种选择是删除菜单,但我不想这样做。我实际上想要它,带有“撤消”和“重做”选项,但这些选项必须是可验证的。Edit

iOS iPad Mac-Catalyst UISeverser

评论

0赞 Victor Engel 10/4/2023
它不会出现在 Xcode 的视图层次结构中,我想这并不奇怪。苹果可能会把它放在一个单独的窗口中。有趣的是,如果我选择撤消(除了关闭菜单之外什么都不做)并再次长按,这次什么也没发生。COMMAND

答:

0赞 Victor Engel 10/4/2023 #1

我不喜欢这个答案,因为我认为这是一个笨拙的答案。此外,它特定于此键命令。在我添加Appdelegate

override var keyCommands: [UIKeyCommand]? {
    [
        UIKeyCommand(title: NSLocalizedString("Undo", comment: ""),
                                          image: nil,
                                          action: #selector(ViewController.undo),
                                          input: "z",
                                          modifierFlags: .command)
    ]
}

在 ViewController 中,我添加了一个空@objc func undo()(我可能会在以后的某个时候用一些东西实现它。但是,对于这种情况,没有什么可撤消的。

在我的验证函数中,撤消现在被捕获,所以当我禁用它时,它实际上被禁用了。

编辑:上面停止了菜单,但撤消操作仍然发生。为了抓住这一点,我列出了 .我没有取消撤消,因为这实际上没关系。但是我必须添加一个,以便刚刚撤消的视图将显示已撤消的操作。NSNotification.Name.NSUndoManagerWillUndoChangesetNeedsDisplay