2011-11-17 58 views
0

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

在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函数的内容查看我有一个NSButton,当点击幻灯片将addSourceView拖到窗口上:

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

但似乎是如果应用程序正在绘制在我放置在IB中的NSView上的IBOutlets上。如果在IB中,我重新分配NSView,以便它在屏幕上显示应用程序启动时的一切正常,IBOutlets以及背景颜色。

我不知道为什么会这样。我之前完成了这个任务,没有任何问题。这次我必须做点不同的事情。

感谢您的任何帮助。

Screen captures

*注 - 三号屏幕捕获,当我说这是应用程序的外观打开时一样,那个时候我硬编码的NSView的Y位置。当它运行正常时,它应该以屏幕截图1的形式打开。

+0

你似乎很困惑..在drawRect中随机尝试诸如-setNeedsDisplay之类的东西不是答案。你读过Hillegass书吗? – hooleyhoop

+0

困惑,是的,但不是你的想法。我放下setNeedsDisplay来看看会发生什么。 – PruitIgoe

+0

好的,我承认 - 我很困惑。从你的描述中不清楚你是使用IB创建你的AddSourceView还是-awakeFromNib – hooleyhoop

回答

0

您的按钮和自定义视图最有可能是兄弟,即它们都是窗口内容视图的子视图。由于兄弟姐妹是根据添加顺序“叠加”的,因此当您在代码中添加视图时,它将被添加到按钮之上。您应该能够通过明确指定其视图应该相对于它的兄弟姐妹新,像这样被定位来解决它:

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

应该把它下方的窗口的内容视图的任何现有的子视图。另外,删除drawRect中的setNeedsDisplay:行,这会导致无意义的,可能是无限的重绘。

编辑:好吧,我明白你在做什么。

我建议通过拖动“自定义视图”对象插入到左边(垂直排列归档对象部分),并加入您的控件有创造的NIB一个standalove观点,认为应确保这些措施能够actualy子视图的视图,那么您可以在代码中创建对存档视图的引用,并根据需要动态添加/删除它。老实说,你可能应该使用这种模式对话框的工作表。为什么重新发明轮子,并在这个过程中让你的应用程序更丑陋?

+0

感谢FM。但是,这将只是位置NSView,我滑落在其他对象在屏幕上(放置在IB中)。请参阅OP,我添加了一些屏幕截图以使事情更清晰。 – PruitIgoe

0

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

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

我不能推荐足够高的Hillegass作为IB的最佳介绍和构建可可应用程序的正确方法。

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

如果您确定您添加一个按钮,在IB您的看法,断言它是如此: -

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

NSAssert是在一个发布版本的零开销的宏。

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