Cocoa:在IBOutlets上绘制NSView drawRect

时间:2011-11-17 13:37:15

标签: cocoa nsview drawrect

我在IB中有一个位于应用程序窗口上方的NSView。我有一个NSView(AddSource)的子类,我分配给NSView。

在awakeFromNib上我实例化视图:

//add a new Add Source class
addSourceView = [[AddSource alloc] initWithFrame:NSMakeRect(0.0, 959.0, 307.0, 118.0)];
[[winMain contentView] addSubview:addSourceView];

在addSourceView的drawRect方法中,我在视图中添加了白色背景:

[[NSColor whiteColor] set];
NSRectFill(rect);
[self setNeedsDisplay:YES];//added this to see if it might solve the problem

在winMain的contentView中,我有一个NSButton,当点击时将addSourceView滑动到窗口上:

NSRect addSourceViewFrame = [addSourceView frame];
addSourceViewFrame.origin.y = 841.0;
[[addSourceView animator] setFrame:addSourceViewFrame];

但似乎该应用程序正在绘制我放置在IB中的NSView上的IBOutlets。如果,在IB中,我重新设置了NSView,以便当应用程序启动时它在屏幕上一切正常,IBOutlets就在那里以及背景颜色。

我不确定为什么会这样。我之前没有遇到任何问题。这次我必须做些不同的事情。

感谢您的帮助。

Screen captures

*注意 - 在第3次屏幕截图中,当我说这是应用程序打开时的样子时,就是我硬编码NSView的Y位置。当它正常运行时,它应该作为屏幕捕获1打开。

2 个答案:

答案 0 :(得分:0)

您的按钮和自定义视图很可能是兄弟,即它们都是窗口内容视图的子视图。由于兄弟姐妹是“堆叠”的,具体取决于它们的添加顺序,当您在代码中添加视图时,它会被添加到按钮顶部。您应该能够通过明确指定视图相对于其新兄弟的位置来修复它,如下所示:

[[winMain contentView] addSubview:addSourceView positioned:NSWindowBelow relativeTo:nil];

应将其置于窗口内容视图的任何现有子视图下方。另外,删除drawRect中的setNeedsDisplay:行,这会导致不必要的,可能无限的重绘。

编辑:好的,我看到你在做什么。

我建议通过将“自定义视图”对象拖到左侧(垂直对齐的存档对象部分)并在那里添加控件来在NIB中创建一个standalove视图,这应该确保控件是实际的子视图在视图中,您可以在代码中创建对存档视图的引用,并根据需要动态添加/删除它。

老实说,你可能应该使用一张表来进行这些模态对话。为什么重新发明轮子,让你的应用程序在这个过程中更加丑陋?

答案 1 :(得分:0)

您向窗口添加了两个 AddSource次观看。您在IB中添加了一个 - 此视图包含连接到IBOutlets的textFields和按钮,它位于窗口之外。

然后在-awakeFromNib中创建另一个空白AddSource视图(不包含任何内容)并将其设置为窗口动画。

我不能高度推荐Hillegass作为IB的最佳介绍以及构建Cocoa应用程序的正确方法。

此外,断言可以帮助确保您认为正在发生的事情实际上是发生了什么。

如果您确定在IB中为视图添加了一个按钮,则断言如此: -

- (void)awakeFromNib {
      NSAssert( myButton, @"did i hook up the outlet?");
}

NSAssert是一个在发布版本中没有任何开销的宏。

[self setNeedsDisplay:YES]调用-drawRect只会导致再次调用相同的-drawRect。这会给你带来很大的问题。