0

AppDelegate内にメインウィンドウの「ウィンドウ」と「ヘルプウィンドウ」の2つのウィンドウがあります。メインウィンドウでは、そのビューがサブクラス化されており、その中に長方形を描画したいと思います。ヘルプウィンドウにも長方形がありますが、NSTrackerがあります。私がやりたいのは、x座標とy座標がNSTrackerの位置に等しいウィンドウサブクラスにrectを描画することです。私が抱えている問題は、座標を取り込もうとするとクラッシュすることです。私が間違っている可能性があることについて何か考えはありますか?ありがとう

//ウィンドウのサブクラスは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は、2番目のウィンドウ「ヘルプウィンドウ」のビューへの参照です

-(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で、別のウィンドウ「helpWindow」にあるためにAppControllerが間違っていますか?またはそれは私のint値と関係がありますか?

4

1 に答える 1

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

明らかないくつかの即時の欠陥があります。まず、呼び出しているメソッド()が?を返すときに、controllerタイプであると宣言するのはなぜですか?AppController*-contentViewNSView

あなたAppControllerはビューではないので(少なくともそうではないはずです!)、オブジェクトを次のように宣言する必要があります。

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

ビューを実際にコントローラーとして使用している場合、これは完全に間違っています。MVCに関する私のメモについては、以下を参照してください。

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

描画コードはを呼び出します[self update]。これは、ビューにそれ自体を再描画するように指示するだけです。ビューが描画されるたびに再描画が強制されるため、これにより無限ループが発生します。内部からは絶対に呼び出さないでください。setNeedsDisplay:drawRect:

これらの変更を行った後でも、このコードは非常に構造が悪く、設計が壊れています。

現状では、コードはModel-View-Controllerパターンに違反しています。ビューは他のビューの知識を持つべきではありません。他のビューの知識を必要とせずにビューがコントローラーのプロパティを表示するように、物事を再構築する必要があります。つまり、マウスの位置をコントローラー(またはモデルオブジェクト)に保存し、ビューがその情報にアクセスするための何らかの方法、できればデータソースプロトコルなどを使用する必要があります。この他の質問に対する私の答えでは、それを行う方法の例を示します。

ココア描画ガイドを読む必要があります。また、Cocoaがどのように機能するかを誤解していることは明らかであるため、Cocoaのコアコンセプトをさらに学ぶ必要があります。

于 2012-04-17T06:07:11.860 に答える