2012-04-22 3 views
4

У меня есть программа objc, и я бы хотел использовать виджет, написанный в objC++ (а именно https://launchpad.net/scintilla-cocoa). Как мне это сделать? В принципе, я хочу, чтобы новый объект контроллера окон взаимодействовал с этой библиотекой objC++, чтобы определить виджет текстового редактора scintilla. Простое создание нового «класса objc» и доступ к библиотеке оттуда генерирует кучу ошибок, связанных с ключевым словом C++ class и так далее.Как связать мою программу objc с библиотекой objC++?

Заранее спасибо

ответ

3

Поскольку я тот, кто поставит вас в (надеюсь, полезный :-)) проблемы использования Scintilla, я здесь.


Допустим, мы создаем ScintillaView подкласс, названный ppScintillaEditor. Файл должен иметь .mm расширение (например, ppScintillaEditor.mm)

код будет примерно так ...

Интерфейс

#import "Scintilla/ScintillaView.h" 

@interface ppScintillaEditor : ScintillaView 
{ 
    // your iVars 
} 

// your properties/methods/whatever 

Теперь, как и для реализации части, не забудьте поставить некоторый метод инициализации, чтобы правильно настроить представление (как в примере, сопровождающем Scintilla-cocoa, я имею в виду проект тестирования)


Sidenote: Конечно, вы можете создавать подклассы, категории или что-то на вершине ScintillaView класс, в значительной степени основаны на том, что вам нужно - я, к примеру, создать отдельную категорию только для того, чтобы группы там некоторые ScintillaView конкретных команд (рано или поздно вы заметите, что для некоторых более продвинутых манипуляций с Scintilla, хотя он есть, может потребоваться некоторое полирование, чтобы быть немного более удобным для какао, поэтому здесь вы идете ...)


Теперь, наконец, но не в последнюю очередь ...

Для решительность"bunch of errors related to the C++ class keyword and so on", так как я показал в моем другом видео-ответ на ваш комментарий, все, что вам нужно сделать, это :

  • Перейти к параметров сборки вашего проекта
  • Под Apple, LL VM Compiler 3.0 - Preprocessing
  • Опция препроцессора Макросы
  • Добавить как Debug и Release:

    SCI_NAMESPACE SCI_LEXER 
    

И это все. :-)


Подсказка: выше определяются Scintilla, чтобы избежать столкновений между С и не-С элементами, как выше ... так, все, что нужно, чтобы уведомить препроцессор и остальные позаботился ....

1

вы бы создать ObjC класс, который имеет интерфейс с вашими потребностями приложений, а затем реализовать и добавить Ивар и реализовать - все за компиляции брандмауэр так в ObjC++ источники не включены в заголовке , ваша реализация обеспечит любые необходимые преобразования.

это как будто вы уже сделали, но вы удаляете заголовки сцинтиллы из заголовка для вашей обертки - они видны только для реализации вашей оболочки.

Обновление

Чтобы проиллюстрировать один из возможных подходов:

MONScintillaWrapper.h

// no c++/scintilla sources should be included in this header 
#import <Foundation/Foundation.h> 

@interface MONScintillaWrapper : NSObject 

- (void)setBackgroundColor:(NSColor *)pColor;  

@end 

MONScintillaWrapper.mm

#import «MONScintillaWrapper .h»

@implementation MONScintillaWrapper 
{ 
    scintilla::t_thing scintillaThing; 
} 

- (void)setBackgroundColor:(NSColor *)pColor 
{ 
...convert pColor to a scintilla color and pass that to scintillaThing... 
} 

@end 
+0

извините, им все еще немного зеленый, чтобы следить за этим. Моя реализация представляет собой файл '.mm' или файл' .m'? в настоящее время это всего лишь файл '.m', мне нужно будет переименовать его в' .mm', чтобы это работало? – horseyguy

+0

yes - '.mm' для этого объекта-обертки. затем объявите свои ivars (объекты сцинтиллы) здесь: '@implementation MONScintillaWrapper {scintilla :: t_thingy scintillaThingy; } '. таким образом, остальной части вашей программы не нужно видеть ваши спермиллы ivars или источники C++. – justin

+0

расширенный ответ, чтобы проиллюстрировать этот подход. – justin

Смежные вопросы