При подключении моей модели данных C ++ к моему пользовательскому интерфейсу столбца таблицы Какао мне интересно, могу ли я предоставить экземпляр класса 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, я могу получить идентификатор и каким-то образом преобразовать его обратно в действительный экземпляр класса C ++:
id columnIdentifer = [aTableColumn identifier];
MyCPPClass* pAValidClass = [someMagicOnTheID columnIdentifer];
pAValidClass->AClassMethod();
Я предполагаю, что есть более традиционный способ сделать это, но я хотел упростить связь между пользовательским интерфейсом Какао и чистой моделью C ++.
Указатель объекта C ++ не может быть сохранен в id
переменная типа В Objective-C, id
указатель на объект Objective-C неизвестного типа Поскольку объект C ++ не является объектом Objective-C, хранить указатель на объект C ++ в id
,
Решение состоит в том, чтобы добавить свойство к вашему классу Objective C, которое будет хранить указатель на объект C ++. Если вы должны использовать id
Вы можете создать класс Objective-C, который обернет свойство, которое хранит указатель на объект 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();
Других решений пока нет …