2012-04-06 71 views
2

新的應對目標C,項目Builder和IB所以請原諒我的知識的缺乏......的NSView未能在一個非常簡單的程序

我試圖創建一個簡單的程序來學習和了解使用NSView類。它由一個帶有單個窗口的單個窗口組成,並帶有四個按鈕,分別標記爲紅色,綠色,藍色和黃色。

目標是推動一個按鈕,並使NSView填充適當的顏色。我嘗試了代碼的幾個變體,但沒有一個看起來更接近結果。目前,在執行時,窗口將顯示一個純黑色正方形(我的NSView子類/稱爲MyView的對象)和四個按鈕。

我可以在MyView.h/.m文件中成功更改MyView的初始顏色,但是,我似乎無法更改顏色或從我的控制器代碼重新繪製MyView(稱爲AppController.h/.m )。我總是收到編譯器警告。

接口在IB中創建,Custom View對象指向MyView子類。我在下面附上我的代碼。

//--------------------------- 
// 
// MyView.h 
// 

#import Cocoa/Cocoa.h 

@interface MyView : NSView 

int myColorChoice; 

@end 

//-------------------------- 
// 
// MyView.m 
// 

#import "MyView.h" 

@implementation MyView 

int myColorChoice = 4; 

-(void) setMyColorChoice : (int) c { 

    myColorChoice = c; 

} 

-(void) drawRect: (NSRect) rect { 

    switch (myColorChoice) { 

     case 1 : 
     [[NSColor greenColor] set]; 
     break; 

     case 2 : 
     [[NSColor blueColor] set]; 
     break; 

     case 3 : 
     [[NSColor redColor] set]; 
     break; 

     case 4 : 
     [[NSColor yellowColor] set]; 
     break; 
    } 

    NSRectFill([self bounds]); 
} 

@end 


//-------------------- 
// 
// AppController.h 
// 

#import <Cocoa/Cocoa.h> 

@interface AppController : NSObject { 

    IBOutlet id display; 
} 

- (IBAction)makeBlue:(id)sender; 
- (IBAction)makeGreen:(id)sender; 
- (IBAction)makeRed:(id)sender; 
- (IBAction)makeYellow:(id)sender; 

@end 

//--------------------- 
// 
// AppController.m 
// 


#import "AppController.h" 
#import "MyView.h" 

@implementation AppController 

- (IBAction)makeGreen:(id)sender { 
    [MyView setMyColorChoice:1]; 
    [MyView setNeedsDisplay:YES]; 
} 

- (IBAction)makeBlue:(id)sender { 
    [MyView setMyColorChoice:2]; 
} 

- (IBAction)makeRed:(id)sender { 
    [MyView setMyColorChoice:3]; 
} 

- (IBAction)makeYellow:(id)sender { 
    [MyView setMyColorChoice:4]; 
} 

@end 

我相當自信,我只是違反了一些基本原則,但我似乎無法繞過這一個。我懷疑它一定是與MyView被錯誤設置有關,就像我嘗試調用我的任何方法一樣,編譯器會給我提供「我的視圖可能不會響應...」的任何我嘗試的方法打電話。

注:我只是在修改makeGreen方法進行實驗。一旦工作,我會複製其他顏色的代碼。

任何幫助將不勝感激!

謝謝你們。

回答

0

您正試圖調用MyView類的實例方法。您的AppController需要對該類的實例的引用。可能做到這一點的最好辦法是與你在IB迷上了一個IBOutlet ......如果這是你display伊娃是什麼,那麼所有你需要做的就是調用[display setColorChoice:1]; [display setNeedsDisplay:YES];

+0

另外,您還沒有聲明實例變量myColorChoice,因此您聲明瞭文件範圍變量。然後,你已經在實現文件中重新聲明瞭它。在接口中,用大括號括住實例變量聲明@interface MyView {int myColorChoice; ... ...。不要(重新)在實現中聲明變量。如果您希望將實例變量初始化爲特定值,請在init方法中執行此操作。 (對於以編程方式創建的視圖,這是initWithFrame:對於從NIB加載的視圖,即-initWithCoder :.)或者,您可以在-awakeFromNib中執行此操作。 – 2012-04-06 05:20:11

+0

你是對的。這就是我設置的顯示器。我只是做了這個改變,並突然發揮作用。(不出意外)。奇怪的是,我發誓我早些時候做過,但沒有奏效。我一定有這個代碼有多個問題,並設法修復一些,而「解開」其他人。 謝謝你的解釋。我已經修復了這些錯誤,現在所有工作都按照我預期的那樣工作,現在可以更好地瞭解我犯的錯誤。 – 2012-04-06 13:43:44

1

有一點要考慮的是設置你的setMyColorChoice方法是這樣的:

-(void)setMyColorChoice:(NSColor *)newColor 
{ 
    [newColor set]; 
    NSRectFill([self bounds]); 
    [self setNeedsDisplay:YES]; 
} 

然後你就可以清理你的drawRect方法,而不是使用整數和一個開關。這將是最有效的方法,因爲您不需要聲明實例變量,從而節省內存。

相關問題