0

我有两个窗口,我的主窗口“窗口”和“帮助窗口”都在我的 App Delegate 中。在我的主窗口中,它的视图是子类的,我想在其中绘制一个矩形。我的帮助窗口也有一个矩形,但上面有一个 NSTracker。我想要做的是在我的窗口子类中绘制我的矩形,x 和 y 坐标等于我的 NSTracker 位置。我遇到的问题是当我尝试输入坐标时它崩溃了,有什么想法我可能做错了吗?谢谢

//我的窗口子类叫做CutoutView。这一切都在draw rect中

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

//我的AppDelegate和tracker helpView是对我的第二个窗口“Help Window”视图的引用

-(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 值有关?

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:

即使进行了这些更改,这段代码的结构也很糟糕,设计也被破坏了。

就目前而言,您的代码违反了模型-视图-控制器模式。一个视图不应该知道其他视图。您需要重组事物,以便您的视图显示控制器的属性,而无需了解其他视图。这意味着您必须将鼠标位置存储在控制器(或模型对象)中,并使用某种方法让视图访问该信息,最好是数据源协议或类似的。在我对另一个问题的回答中,我举了一个例子来说明如何做到这一点。

您需要阅读Cocoa 绘图指南。您还需要学习更多核心 Cocoa 概念,因为很明显您误解了 Cocoa 应该如何工作。

于 2012-04-17T06:07:11.860 回答