2011-10-05 248 views
7

所以我認爲我已經覆蓋了我的基地,但顯然我錯過了一個或兩個關鍵步驟。NSPanel未在界面生成器中選中「標題欄」

我有一個NSPanel顯示(makeKeyAndOrderFront:),當NSStatusItem被按下時。事情很好,但由於NSPanel顯示標題欄,面板也可以拖動。 (這是不希望的。)

第一個屏幕截圖顯示了在界面生成器中啓用了「標題欄」的面板的外觀類別中。 (很抱歉的模糊,事情仍然在鎖和鑰匙現在。)

First screenshot

變化是在Interface Builder提出的取消選中「標題欄」複選框。然後我保存並重新運行,這就是您在第二個屏幕截圖中看到的內容。雖然出現輕微的陰影,但面板卻沒有。

enter image description here

事情我已經嘗試:

  • 我子類的NSPanel和一些調查後canBecomeKeyWindowcanBecomeMainWindow返回YES,但(前子類),這些無論我是否使用標題欄,都返回NO。所以我不認爲這是問題。

  • 我已經確保NSPanel的框架已正確設置。它有一個很好的高度,並且原點也設置得很好。

編輯:忘了提:

應用程序是一個菜單欄,唯一的應用程序。在下面的屏幕截圖中,請注意,Info.plist中增加了一個條目來執行此操作。

Info Plist

回答

4

我已經在過去的這個問題。我能夠通過首先「忽略」其他應用程序來解決它,然後將其作爲關鍵窗口。試試看,看看它是否適合你。

[NSApp activateIgnoringOtherApps:YES]; 
[[self window]makeKeyAndOrderFront:self]; 

另外,嘗試在初始化期間將窗口級別設置爲NSPopUpMenuWindowLevel

[[self window]setLevel:NSPopUpMenuWindowLevel]; 

我也有過與筆尖文件被加載在Mac OS X他們裝「懶洋洋」的方式,這意味着,在需要他們之前,他們將不會被初始化的問題。當你想在窗口上設置細節時,這會產生問題,但是你不能,因爲awakeFromNib似乎沒有被調用,因爲延遲的nib加載。爲了解決這個問題,這是我過去所做的。在您的代理(或任何你初始化窗口),一腳把窗戶變成行動通過訪問初始化類window屬性:

wc = [[blah alloc]initWithWindowNibName:NSStringFromClass([blah class])]; 
(void)[wc window]; //just kicks the lazy nib loading into gear 

通過這樣做,你就迫使筆尖初始化。這樣,當用戶單擊菜單欄圖標時,筆尖已經初始化,並且awakeFromNib已被調用。

+0

不幸的是,這些解決方案似乎都沒有幫助。 :( –

+0

你確定嗎?你在哪裏放置這個?你是否嘗試同時使用它們?另外,我會在我的答案中加入一些東西。 –

+0

不,你知道嗎,你是對的。但是我打算清除一些代碼然後回來 –

1

雖然出現輕微的陰影,面板沒有。

你是說makeKeyAndOrderFront:在運行你的應用程序時,NSPanel對象不顯示它嗎?我剛剛創建了一個示例項目,NSButton觸發了相同類型的NSPanel來顯示,並且它工作正常.. titleBar已啓用或未啓用。

http://cl.ly/3d0U3C0P3u2D0m3T1w1N

+0

同意。似乎沒有可能重現這一點,代碼庫中一定有其他的東西導致這種行爲。 – jrturton

+0

我可能已經遺漏了一個關鍵的難題。在Info.plist文件中,應用程序還必須註冊爲代理。 (這是一個僅適用於菜單欄的應用程序,因此沒有Dock圖標是首選。)使用屏幕截圖更新了問題。 –

相關問題