2012-04-17 153 views
0

我有兩個窗口,我的主窗口「窗口」和「幫助窗口」都在我的App Delegate中。在我的主窗口中,它的視圖是分類的,我想在其中繪製矩形。我的幫助窗口也有一個矩形,但它有一個NSTracker。我想要做的是在我的窗口子類中繪製矩形,其x和y座標等於我的NSTracker位置。我遇到的問題是當我嘗試引入座標時崩潰,對於我可能做錯什麼的想法?謝謝從其他類訪問int變量

//我的窗口的子類被稱爲CutoutView。這是所有在平局矩形

AppDelegate *controller = [[[NSApp delegate] window] contentView]; 

     xValue = controller.mouseLoc.x; 
     yValue = controller.mouseLoc.y; 

     NSRectFillUsingOperation(NSMakeRect(xValue,yValue, 600, 400), NSCompositeClear); 
     [self update]; 

- (void)update 
{ 
    NSLog(@"test"); 
    [self setNeedsDisplay:YES]; 
} 

//我與跟蹤helpView AppDelegate的是我的第二個窗口的視圖「幫助窗口」

-(void)updateTrackingAreas 
{ 
    if(trackingArea != nil) { 
     [self.helpView removeTrackingArea:trackingArea]; 
     [trackingArea release]; 
    } 

    opts = (NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved); 

    trackingArea = [ [NSTrackingArea alloc] initWithRect:[self.helpView bounds] 
               options:opts 
                owner:self 
               userInfo:nil]; 
    [self.helpView addTrackingArea:trackingArea]; 
    } 

    -(void)mouseMoved:(NSEvent *)theEvent 
    { 
     mouseLoc = [NSEvent mouseLocation]; 
     NSLog(@"mouseMoved: %f %f", mouseLoc.x, mouseLoc.y); 

    } 
我CutoutView

我收到的AppController中的參考錯誤,因爲它在不同的窗口「helpWindow」?或者它與我的int值有關嗎?

+0

它在哪裏崩潰?什麼是錯誤信息? – 2012-04-17 03:37:37

+0

它說mouseLoc是發送到實例的無法識別的選擇器,我的mouseLoc是跟蹤器的NSPoint,是一個問題,它的x和y值,並從int值xValue和yValue訪問它們? – 2012-04-17 03:41:31

回答

1

你的代碼有很多錯誤,顯然你基本上誤解了一些基本概念。

首先,您聲明此代碼位於您的drawRect:方法中;

AppDelegate *controller = [[[NSApp delegate] window] contentView]; 

xValue = controller.mouseLoc.x; 
yValue = controller.mouseLoc.y; 

NSRectFillUsingOperation(NSMakeRect(xValue,yValue, 600, 400), NSCompositeClear); 
[self update]; 

有幾個直接的缺陷顯而易見。首先,爲什麼當您調用的方法(-contentView)返回NSView時,爲什麼要聲明controllerAppController*

AppController不是一個視圖(至少不應該是!),所以你應該申報對象爲這樣:

NSView* mainView = [[[NSApp delegate] window] contentView]; 

如果你確實使用一個視圖控制器,那麼這是完全錯誤。請參閱下面的關於MVC的說明。

您不指定mouseLoc屬性來自何處。我們需要看看這個聲明在哪裏,因爲這會影響它是否存在問題。

您的繪圖代碼調用[self update],它只是告訴視圖重繪自己。這將導致無限循環,因爲每次視圖繪製都會被強制重繪。你應該從來沒有drawRect:內部致電setNeedsDisplay:

即使做出這些更改,此代碼結構非常糟糕,設計也被破壞。

現在,您的代碼違反了模型 - 視圖 - 控制器模式。意見不應該有其他意見的知識。您需要重構事物,以便您的視圖顯示控制器的屬性,而無需瞭解其他視圖。這意味着您必須將鼠標位置存儲在控制器(或模型對象)中,並使用某種方法訪問該信息,最好是數據源協議或類似信息。在my answer to this other question我舉了一個如何做到這一點的例子。您需要閱讀Cocoa Drawing Guide。您還需要了解更多core Cocoa concepts,因爲很顯然您誤解了Cocoa應該如何工作。