3

在将我的 C++ 数据模型连接到我的 Cocoa 表列 UI 时,我想知道是否可以将 ID(标识符)处的 C++ 类实例提供给 initWithIdentifier

// what magic needs to occur to create an id from a CPP class?
id someIDMadeFromAClassInstance = a_ptr_to_a_cpp_class_instance;

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

这样做的重点是,当调用 NSTable 的数据源方法 objectValueForTableColumn 时,我可以检索 id 并以某种方式将其转换回有效的 C++ 类实例:

id columnIdentifer = [aTableColumn identifier];

MyCPPClass* pAValidClass = [someMagicOnTheID columnIdentifer];

pAValidClass->AClassMethod();

我猜有一种更传统的方法可以做到这一点,但我想简化 Cocoa UI 和纯 C++ 模型之间的连接。

4

1 回答 1

4

C++ 对象指针不能存储在id类型变量中。在 Objective-C 中,id是一个指向未知类型的 Objective-C 对象的指针。由于 C++ 对象不是 Objective-C 对象,因此将指向 C++ 对象的指针存储在id.

解决方案是向您的 Objective-C 类添加一个属性,该属性将存储一个 C++ 对象指针。如果必须使用id,则可以创建一个包含存储 C++ 对象指针的属性的 Objective-C 类,例如:

@interface MyCPPClassWrapper : NSObject

@property (nonatomic, assign) MyCPPClass *myCPPClass;

@end

// ...

MyCPPClassWrapper *wrapper = [[MyCPPClassWrapper alloc] initWithMyCPPClass:myCPPClass];

// Hand wrapper off to your NSTable

看看NSValue以及。它为 C 风格的指针提供了一种存储机制。对于 NSValue,您可以执行以下操作:

NSValue *someIDMadeFromAClassInstance = [NSValue valueWithPointer:a_ptr_to_a_cpp_class_instance];

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

// ...

NSValue *columnIdentifer = (NSValue *)[aTableColumn identifier];
MyCPPClass* pAValidClass = (MyCPPClass *)[columnIdentifer pointerValue];
pAValidClass->AClassMethod();
于 2013-11-18T19:45:30.393 回答