Цель C++ доступ к NSSlider из обратного вызова C++
AppController.h
@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
}
1 ответ
Решение
Нет.
В этом случае, хотя myCallBackFunction()
находится между @implementation
а также @end
это не в рамках класса AppController
, int myAmount
это как статический член класса (я на самом деле понятия не имею, какова его область. Глобальная??), потому что вы определили его в файле реализации, на самом деле он не является частью объекта AppController
,
Нет гарантий, что это сработает, но попробуйте. Предполагается, что будет только 1 (один) экземпляр AppController. Читайте больше на Singletons в 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