从其他类访问int变量

时间:2012-04-17 03:35:44

标签: objective-c xcode cocoa

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

//我的窗口子类叫做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];
}

//我的AppDelegate与跟踪器helpView是对第二个窗口“帮助窗口”视图的引用

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

1 个答案:

答案 0 :(得分: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*时,为什么要声明-contentView属于NSView类型?

你的AppController不是一个视图(至少它不应该是!),所以你应该声明这个对象:

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

如果你确实使用视图作为控制器,那么这是完全错误的。有关MVC的说明,请参见下文。

您没有指定mouseLoc属性的来源。我们需要查看声明的位置,因为这会影响它是否存在问题。

您的绘图代码调用[self update],它只是告诉视图重绘自己。这将导致无限循环,因为每次视图绘制时都会强制重绘。您从不setNeedsDisplay:内部{/ 1}}拨打电话。

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

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

您需要阅读Cocoa Drawing Guide。您还需要了解更多core Cocoa concepts,因为很明显您误解了Cocoa应该如何工作。