gpt4 book ai didi

cocoa - 在 cocoa 应用程序中启用或禁用不同 View Controller 上的菜单项?

转载 作者:行者123 更新时间:2023-12-03 16:40:08 24 4
gpt4 key购买 nike

我有 3 个 View Controller ,分别是 main1、main2 和 child。我添加了一个菜单项,单击该菜单项应该将 subview Controller 打开为模式。每当用户处于 main1 VC 中时,应启用菜单项。如果用户使用 main2 VC,则应禁用菜单。现在我已经在菜单项和子 VC 之间添加了模式转场。我按照以下方法进行禁用,但它们不起作用。

方法一:在 main2 VC 中,我添加了

 func validateUserInterfaceItem(_ anItem: NSValidatedUserInterfaceItem) -> Bool {
return false
}

override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
return false
}

方法2:

 override func viewDidLoad() {
super.viewDidLoad()
let mainMenu = NSApplication.shared().mainMenu!
let appMenu = mainMenu.item(at: 0)!.submenu
appMenu?.item(withTitle: someMenuTitle)?.isEnabled = false
}

最佳答案

如果您使用模态转场,它将始终被激活。要根据所呈现的 View Controller 启用/禁用,我将向 View Controller 添加一个操作以手动打开 View Controller 作为模式。菜单项必须通过第一响应者连接到操作 (openModalViewController)。

@IBAction func openModalViewController(_ sender: AnyObject) {

let storyboard = NSStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateController(withIdentifier: "MyViewController") as! NSViewController
presentAsModalWindow(viewController)
}

考虑必须至少有一个 View 能够获取菜单项将激活的 main1/main2 中的第一个响应者。如果不是这种情况,您必须为相应的 View 实现 acceptsFirstResponder

override var acceptsFirstResponder: Bool{
return true
}

在这种情况下,不需要实现 validateUserInterfaceItem,只有当您想要根据附加状态来控制激活/停用时,如下例所示。

extension ViewController: NSMenuItemValidation {

func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {

if menuItem.action == #selector(delete(_:)) {
return tableView.selectedRow < 0 ? false : true
}

return true
}
}

关于cocoa - 在 cocoa 应用程序中启用或禁用不同 View Controller 上的菜单项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53929295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com