我在我的 Catalyst 应用程序中遇到了一个可能相关的问题。
我正在使用 menu-builder 方法,但我发现该应用程序将为一个视图控制器请求一个菜单,但尝试针对另一个视图控制器验证它。我认为这是因为我有两个视图控制器负责同一屏幕的各个部分。
我使用的解决方法是在另一个视图控制器中处理一个视图控制器的菜单项的查询。例如,假设您有共享屏幕的控制器,称为
该应用程序将调用 MainVC 的菜单构建器,但您希望有一些调用 PlaybackVC 方法的热键。例如,您可以使用调用 PlayViewController.nextClip() 的项目来填充播放菜单。
@available(iOS 13.0, *)
class func playbackMenu() -> UIMenu
{
let prevCmd =
UIKeyCommand(title: "Previous clip",
image: nil,
action: #selector(PlayViewController.cmdPrevClip(_:)),
input: UIKeyCommand.inputLeftArrow,
modifierFlags: .control,
propertyList: nil)
let nextCmd =
UIKeyCommand(title: "Next clip",
image: nil,
action: #selector(PlayViewController.cmdNextClip(_:)),
input: UIKeyCommand.inputRightArrow,
modifierFlags: .control,
propertyList: nil)
let loopCmd =
UIKeyCommand(title: "Loop",
image: nil,
action: #selector(PlayViewController.cmdToggleLoopClip(_:)),
input: "L",
modifierFlags: .control,
propertyList: nil)
let theMenu =
UIMenu(title: "Playback",
image: nil,
identifier: UIMenu.Identifier("com.atomos.AtomRemoteMenus.playbackMenu"),
options: .destructive,
children: [prevCmd, nextCmd, loopCmd])
return theMenu
}
稍后,当操作系统要求MainVC验证 Playback 菜单中的项目时,MainVC 的 canPerformAction()方法需要像这样处理它:
else if action == #selector(PlayViewController.cmdNextClip(_:))
{
if m_playController != nil
{
return m_playController!.canPerformAction(#selector(PlayViewController.cmdNextClip(_:)), withSender: sender)
}
else
{
return false
}
}
所以是的,我在 PlayViewController 中有一个多余的 canPerformAction 方法,因为我不知道它是否有一天会被调用。
你可能会想,嘿,我只是在 MainVC 中创建存根方法,然后调用 Playback 菜单中的那些方法,然后调用 PlayViewController 的方法。不,因为每个菜单项的命令都针对它认为活动视图控制器在任何给定点的目标......在我的情况下不是 MainVC。