4

我有一个 objc 程序,我想使用一个用 objc++ 编写的小部件(即https://launchpad.net/scintilla-cocoa)。我该怎么做?基本上我想要一个新的窗口控制器对象来与这个 objc++ 库接口来定义一个闪烁的文本编辑器小部件。简单地创建一个新的“objc 类”并从那里访问库会产生一堆与 C++class关键字相关的错误等等。

提前致谢

4

2 回答 2

3

由于我是让您陷入使用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",正如我在其他视频中对您的评论所做的回复所示,您所要做的就是:

  • 转到项目的构建设置
  • Apple LLVM Compiler 3.0下- 预处理
  • 选项预处理器宏
  • 添加到DebugRelease

    SCI_NAMESPACE SCI_LEXER
    

就是这样。:-)


提示:上面是由 Scintilla 定义的,以避免 C 和非 C 元素之间的冲突,就像上面一样……所以,只需要通知预处理器,其余的就被处理了……

于 2012-04-23T05:31:35.467 回答
1

您将创建一个 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
于 2012-04-22T09:10:19.777 回答