我有两个窗口,我的主窗口“窗口”和“帮助窗口”都在我的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值有关?
答案 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应该如何工作。