我在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就在那里以及背景颜色。
我不确定为什么会这样。我之前没有遇到任何问题。这次我必须做些不同的事情。
感谢您的帮助。
*注意 - 在第3次屏幕截图中,当我说这是应用程序打开时的样子时,就是我硬编码NSView的Y位置。当它正常运行时,它应该作为屏幕捕获1打开。
答案 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
。这会给你带来很大的问题。