2012-04-17 6 views
0

私は2つのウィンドウを持っています。私のメインウィンドウ "ウィンドウ"と "ヘルプウィンドウ"はすべて私のApp Delegateの中にあります。私のメインウィンドウでは、そのビューはサブクラス化されており、その内部にrectを描画したいと考えています。私のヘルプウィンドウにもrectがありますが、それにはNSTrackerがあります。私がしたいことは、ウィンドウのサブクラスにxとyの座標を自分のNSTrackerの位置に合わせてrectを描画することです。私が持っている問題は、私が座標を持って来ようとするとクラッシュし、私が間違っていることがあるという考えはありますか?ありがとう他のクラスからint変数にアクセスする

//私のサブクラスのウィンドウは、CutoutViewと呼ばれます。これは、トラッカーhelpViewと私AppDelegateは私の第二のウィンドウ「ヘルプウィンドウ」の図を参照され

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]; 
} 

// RECTすべて引き分けで私CutoutViewで

-(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); 

    } 

である私はのAppControllerを取得していますそれは別のウィンドウ "helpWindow"にあるので間違っていますか?それとも私のint値と関係がありますか?

+0

どのラインがクラッシュしていますか?エラーメッセージとは何ですか? –

+0

これは、mouseLocがインスタンスに送信された認識できないセレクタであると言っています。私のmouseLocはトラッカーのNSPointです。x値とy値を取ってint値xValueとyValueからアクセスするのは問題ですか? –

答えて

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]; 

いくつかの即時の欠陥が明らかです。まず、controllerAppController*と指定すると、呼び出すメソッド(-contentView)がNSViewを返すのはなぜですか?

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

あなたが実際にコントローラとしてビューを使用している場合は、これは次のとおりです。あなたのようなオブジェクトを宣言する必要がありますのでごAppController

は、(!少なくともそれはすべきではない)のビューではありません完全に間違っている。 MVCについての私のメモは以下を参照してください。

mouseLocプロパティの送信先は指定しません。これが宣言されている場所を確認する必要があります。これは、問題があるかどうかに影響を与えるためです。

描画コードで[self update]が呼び出されます。これは単にビューに再描画を指示します。これは、ビューが描画されるたびに強制的に再描画されるため、無限ループになります。 決してdrawRect:から電話する必要があります。

これらの変更を加えても、このコードは非常にひどく構造化されており、デザインが壊れています。

あなたのコードはModel-View-Controllerパターンに違反しています。ビューは他のビューの知識を持ってはいけません。他のビューの知識がなくても、ビューがコントローラのプロパティを表示できるように、構造を変更する必要があります。つまり、コントローラ(またはモデルオブジェクト)にマウスの位置を格納し、ビューがその情報にアクセスするためのいくつかのメソッド、好ましくはデータソースプロトコルなどを使用する必要があります。 my answer to this other questionでは、私はそれを行う方法の例を挙げています。

Cocoa Drawing Guideを読む必要があります。また、ココアがどのように動作するのか誤解していることは明らかですので、さらにcore Cocoa conceptsを学ぶ必要があります。

関連する問題