Цель 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
Другие вопросы по тегам