2011-02-23 15 views
-1

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

回答

1

在這種情況下,即使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