客观C++从C访问一个NSSlider ++回调

问题描述:

AppController.h客观C++从C访问一个NSSlider ++回调

@interface AppController : NSObject { 

} 

@property (retain) IBOutlet NSSlider * mySlider; 

void setMySlider (NSSlider *ns);// c function 

AppController.m

@implementation AppController 

int myAmount=0; 
@synthesize mySlider; 


void setMySlider(NSSlider *mySlider){ 

    [ns setIntValue:10]; //ok 
    ns.intValue =myAmount;//ok 
} 

myCallBackFunction(double delta,std::vector<unsigned char>*myData,void *userData){ 

myAmount=50; 
NSLog(@"%i", myAmount); // ok does display value of myAmount 

// should move my slider the value of my amount by calling the following C function: 

changeSliderVelocity(mySlider);// error message mySlider was not declared in this scope 

} 
+0

请写出你的问题显然 – Dominic 2011-02-23 20:13:31

在这种情况下,即使myCallBackFunction()放置@implementation@end之间它不在AppController的类范围内。 int myAmount就像一个静态的Class-Ish成员(我实际上不知道它的作用域是什么。Global?),因为你在Implementation文件中定义了它,它实际上并不是对象AppController的一部分。

没有保证这将工作,但给它一个镜头。它假定只有一个(一个)AppController实例。阅读关于Obj-C/C++中单例的更多信息。

@implementation AppController 

static AppController *sharedAppInstance = nil; 

- (void) init 
{ 
    // ... whatever other code you have 
    if (sharedAppInstance == nil) 

    sharedAppController = self; //error message sharedAppController was not declared in //this scope. So I replaced the line sharedAppController = self; by: 

     sharedAppInstance= self; 

} 

myCallBackFunction(double delta,std::vector<unsigned char>*myData,void *userData){ 

changeSliderVelocity([[AppController sharedAppInstance] mySlider]); // Replace this line with to make it work: 
changeSliderVelocity([sharedAppInstance mySlider]);//ok does work. 

} 

@end 
+0

感谢您的及时回复斯蒂芬我试过你的代码,但它有一个错误信息就出来了:sharedAppController范围没有宣布。我试图使用可可只是为了GUI。 myCallbackFunction将全局变量myAmount设置为50,它可以正常工作并更新滑块的位置,或将值myAmount显示到我遇到问题的NSTextField中。只要我尝试访问可可对象,我就会问题(错误未在此范围内声明)。 – 2011-02-24 17:53:52

+0

@boubacar mamadou,试试这个:'[[AppController sharedAppInstance] mySlider]' – 2011-02-24 18:58:41

+0

非常感谢你斯蒂芬你指出我在正确的方向。关键是创建init函数并将sharedAppInstance设置为self并且在回调中,通过c函数访问sharedAppInstance mySlider changeSliderVelocity.I在代码中更改了2行,可以随意查看。过去3周我一直试图解决这个问题,但没有成功。再次非常感谢你的帮助,如果没有它,我们将无法完成。 – 2011-02-25 19:05:51