从选择器调用函数指针
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。
我有一个 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。