2011-11-17 59 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。這會給你帶來很大的問題。