我有一个 objc 程序,我想使用一个用 objc++ 编写的小部件(即https://launchpad.net/scintilla-cocoa)。我该怎么做?基本上我想要一个新的窗口控制器对象来与这个 objc++ 库接口来定义一个闪烁的文本编辑器小部件。简单地创建一个新的“objc 类”并从那里访问库会产生一堆与 C++class
关键字相关的错误等等。
提前致谢
我有一个 objc 程序,我想使用一个用 objc++ 编写的小部件(即https://launchpad.net/scintilla-cocoa)。我该怎么做?基本上我想要一个新的窗口控制器对象来与这个 objc++ 库接口来定义一个闪烁的文本编辑器小部件。简单地创建一个新的“objc 类”并从那里访问库会产生一堆与 C++class
关键字相关的错误等等。
提前致谢
由于我是让您陷入使用Scintilla的(希望是有益的:-))麻烦的人,所以我来了。
假设我们创建了一个ScintillaView
名为 的子类ppScintillaEditor
。该文件应该有一个.mm
扩展名(例如ppScintillaEditor.mm
)
代码大概是这样的......
界面
#import "Scintilla/ScintillaView.h"
@interface ppScintillaEditor : ScintillaView
{
// your iVars
}
// your properties / methods / whatever
现在,至于实现部分,记得放一些初始化方法来正确设置视图(如随附的 Scintilla-cocoa 示例;我的意思是测试项目)
旁注:当然,您可以在类之上创建子类、类别或其他任何内容ScintillaView
,这几乎取决于您的需要 - 例如,我创建了一个单独的类别只是为了将一些ScintillaView
特定命令分组(迟早,你会注意到,对于一些更高级的 Scintilla 操作,虽然它在那里,但可能需要一些抛光才能对可可更友好,所以你去吧......)
现在,最后但并非最不重要的...
要解决这个问题"bunch of errors related to the C++ class keyword and so on"
,正如我在其他视频中对您的评论所做的回复所示,您所要做的就是:
添加到Debug和Release:
SCI_NAMESPACE SCI_LEXER
就是这样。:-)
提示:上面是由 Scintilla 定义的,以避免 C 和非 C 元素之间的冲突,就像上面一样……所以,只需要通知预处理器,其余的就被处理了……
您将创建一个 objc 类,该类具有您的应用程序所需的接口,然后实现并添加 ivars 并实现——所有这些都在编译防火墙之后,因此 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