2010-11-10 76 views
0

這是推動我瘋了。非常感謝有人能幫助我!參考CustomView從我的控制器

問題: 我已經子類的NSView(和實施initWithRect:drawRect:),並將其連接到一個IB customView。然後在我的Controller.h中,我試圖通過使用Viewer *view;(查看器是我的NSView的子類)創建對此實例的引用。但是,當我試圖達到僅執行printf("something")的虛擬功能時,什麼都不會發生。因爲我沒有爲這個實例分配任何內存[view retainCount]給出0.我的理解是IB會爲我實例化這個類。我希望能夠引用該實例的原因是,我可以撥打[view setNeedsDisplay: YES]以便重新繪製視圖。我已將自定義視圖連接到IB的視圖插口並保存。

#import "Viewer.h" 
#import "Controller.h" 


@implementation Viewer 

- (id)initWithFrame:(NSRect)frameRect 
{ 
    self = [super initWithFrame:frameRect]; 
    return self; 
} 

-(void)awakeFromNib 
{ 
    printf("awake!\n"); //works! 
} 

- (void)drawRect:(NSRect)rect 
{ 
    CGContextRef myContext = [[NSGraphicsContext currentContext]graphicsPort]; 
    for (int i=0; i<8; i++) { 
     for (int j=0; j<8; j++) { 
      printf("%f\n",gPopulation[i][j]/2); 
      CGContextSetRGBFillColor (myContext, gPopulation[i][j]/2, 0.3, 0.1, 1); // Set color 
      CGContextFillRect (myContext, CGRectMake (i*50, j*50, 50, 50)); 
     } 
    } 
} 


**- (void) redraw { //dummy function that I can't reach from controller with [view redraw]. Gives no error, but retainCount = 0** 
    printf("redraw------\n"); 
    //[self display]; 
} 

@end 

#import <Cocoa/Cocoa.h> 
#import "Viewer.h" 

double gPopulation[8][8]; 

@interface Controller : NSObject { 
    NSMutableArray *emptySpots; 
    int nEmpty, nWhite, nBlack; 
    NSOperationQueue *queue; 
    IBOutlet Viewer *view; 
} 
- (void) main; 
- (id) initWithMain; 
- (void) updatePopulation; 
- (void) initPopulation; 
@end 

回答

0

您所描述的步驟是不完全清楚,但這裏有幾件事情,脫穎而出:

1 - 這不是你的地方要問的對象爲其-retainCount確定無論是正在使用或不。你無法知道(也不應該知道或依賴於知道)還有什麼可能對這個對象有興趣。

2 - 你通過查看檢查一個有效的對象,如果對象指針(在你的情況「視圖」)是有效的(指向一個對象),或者是零。

3 - 在創建自定義NSView子類並在nib/xib中實例化副本時,需要將NSView實例從庫中拖出,然後將其類名設置爲子類的名稱,否則Interface Builder只是創建一個NSView的實例。我不認爲這是你的問題(見#4),但你沒有這樣說,所以這是另一回事。

4 - 當您將消息發送到零,沒有什麼是什麼是應該發生的,那麼很可能你的「視圖」指針/出口是零。

5 - 這很容易混淆「的實例我在運行時創建」「我創造,並在筆尖/廈門國際銀行所引用的實例」。這種情況經常發生在那些Cocoa新手。您是否絕對肯定持有連接的對象實例(名爲「view」)與您在運行時正在檢查的實例相同?例如,您創建一個名爲MyController的控制器類,在您的nib/xib(作爲藍色立方體)中實例化它,將它連接起來等。然後在運行時,您實例化一個新的MyController([[MyController alloc] init]。 ),並試圖訪問它的(無)「視圖」插座,它沒有指向任何東西,因爲它不是你的nib/xib中的實例。

+0

感謝您的回答, – salomons 2010-11-10 20:24:30

+0

更新了更多的心思。 – 2010-11-10 20:26:07

+0

1.確定 2.嘗試 如果(圖==無){ 的printf( 「isNil」); } 而事實上它是零。奇怪,因爲我已經連接了自定義視圖(我改變了不是NSView,但查看器[我的子類])與我的控制器類中的插座視圖。它應該真的是零? 3.我將CustomView的副本拖到我的窗口中。這一定是一回事,對嗎? – salomons 2010-11-10 20:29:44