objective-c - 如何启用主菜单项 "copy"?

标签 objective-c xcode macos

我的主菜单项“复制”不可点击:

enter image description here

但我在 Xcode 中启用它:

enter image description here

我在代码中没有任何主菜单项的导出。 我能做什么?

最佳答案

“Enabling Menu Items” in Application Menu and Pop-up List Programming Topics是这样说的:

By default, every time a user event occurs, NSMenu automatically enables and disables each visible menu item. You can also force a menu to update using NSMenu’s update method.

还有这个:

If the menu item’s target is not set (that is, if it is nil—typically if the menu item is connected to First Responder) and the NSMenu object is not a contextual menu, then NSMenu uses the responder chain (described in “The Responder Chain” in Cocoa Event Handling Guide) to determine the target. If there is no object in the responder chain that implements the item’s action, the item is disabled. If there is an object in the responder chain that implements the item’s action, NSMenu then checks to see if that object implements the validateMenuItem: or validateUserInterfaceItem: method. If it does not, then the menu item is enabled. If it does, then the enabled status of the menu item is determined by the return value of the method.

默认情况下(当您使用“Cocoa Application”模板创建项目时),Copy 菜单项的目标是 First Responder (nil),操作是 copy:。因此,您需要在响应链中的某些项目上实现 copy: 方法。这足以启用菜单项。如果您想更精确地控制菜单项何时启用,您还可以实现 validateMenuItem: 来检查正在验证哪个菜单项并返回 YESNO 视情况而定。

例如,应用程序委托(delegate)在响应者链中。因此,您可以将此方法添加到 CMAppDelegate:

- (IBAction)copy:(id)sender {
    NSLog(@"%@ %s", self, __func__);
}

这应该足以启用复制菜单项。当然,选择“编辑”>“复制”只会将一条消息记录到控制台。由您实际编写复制用户选择的任何代码的代码。

如果您想要更精细的控制,请尝试为应用委托(delegate)提供一个连接到 Copy 菜单项的导出:

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (strong) IBOutlet NSMenuItem *copyMenuItem;

@end

连接 MainMenu.xib 中的 socket 。然后你可以像这样实现 validateMenuItem::

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    if (menuItem == self.copyMenuItem) {
        NSLog(@"%@ %s %@", self, __func__, menuItem);
        return [self shouldEnableCopyMenuItem];
    }
    return NO;
}

关于objective-c - 如何启用主菜单项 "copy"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15842226/

相关文章:

ios - 如何在 ios objective c 中以编程方式从 sim 卡获取国家代码

iphone - 如何在ipad中使用core-plot绘制3D饼图?

xcode - 展开后执行 segue

ios - Xcode 8.3 自动完成和语法突出显示不起作用

macos - 如何在 OSX 上迭代所有挂载的文件系统

macos - 在文件夹操作上运行applescript

objective-c - Swizzling 方法,隐式返回 ARC 下的保留对象

objective-c - 如何枚举 CGPoints 的 nsmutablearray?

iphone - iOS将音频从一台iOS设备传输到另一台iOS设备

python - 在 OSX 10.8.4 上卸载 Python 2.7