从选择器调用函数指针

Call function pointer from selector

我有一个 NSMenuItem,我用这个创建它:

NSMenuItem* nsMenuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:menuItem->getText()] action: keyEquivalent:@""];

现在我传入一个函数指针,我想在调用选择器时调用它。

我该怎么做?

我试过:

id block = [^{
             functionPointer();
             } copy];
        
NSMenuItem* nsMenuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:menuItem->getText()] action:@selector(invoke) keyEquivalent:@""];
[nsMenuItem setTarget:block];

但是,菜单项仍然是灰色的。

如何传入函数指针作为选择器?

我正在构建一个跨平台应用程序,所以基本上我调用是为了创建一个新菜单,我的核心 C++ 代码将为菜单项传入一个函数指针。

首先,您需要了解菜单的工作原理。你读过文档了吗?尤其是关于enabling menu items的那一段很有见地。

简要概述:选择器 是调用菜单项时将调用的函数的名称。它不是一个函数,它是一个函数的名称。在 Smalltalk 中,人们会说这是要发送的 消息

目标是接收消息的对象。

菜单机制检查目标是否实现了选择器功能。由于您的目标是一个块,它根本不实现任何功能,因此菜单项始终处于禁用状态。

您需要做的是:

  • 将要执行的块存储在某处
  • 向您的菜单项添加一个通用选择器,例如“performBlock”
  • 将存储块的class设置为目标
  • 在那个 class 中,实现一个函数 performBlock 并在那里调用块

您可以子class NSMenuItem 并将块保留在那里,请参阅此示例 here