2011-02-06 18 views

回答

6

嗯,我最終找出了這個問題,但它花了很多研究,所以我會在這裏發佈細節,以防其他人遇到同樣的問題。首先,一些基本知識:

  1. 這是不可能有2個窗口實際上是在同一時間關鍵
  2. 有可能僞造了一個窗口想這是關鍵通過覆蓋-isKeyWindow但不會給包含在窗口第一響應者狀態中的視圖。

我的情景:

我加入含NSTableView一個子窗口進入我的主應用程序窗口(原因是irrelavant)。子窗口是NSPanelNSBorderlessWindowMask。我想給NSTableView第一響應者狀態,而不使面板成爲關鍵窗口,因爲它從主窗口奪走了焦點(並且子窗口錯覺的全部點是使子窗口看起來像它是主窗口的一部分)。

我嘗試的第一件事是愚弄桌面視圖,認爲它在關鍵窗口內,通過覆蓋isKeyWindow返回YES。這使得表格視圖被描繪爲它是第一響應者,但仍然沒有給予其第一響應者狀態。

解決方案:

所以在默認情況下,NSBorderlessWindowMask將不允許窗口成爲關鍵。爲了讓表視圖成爲第一響應者,窗口必須是關鍵字,所以我在無邊界窗口子類中覆蓋canBecomeKeyWindow以返回YES。當然,這從主窗口中取走了關鍵狀態,這是我想避免的事情之一。爲了解決這個問題,我劃分子類我窗口,並推翻了以下方法:

- (BOOL)isMainWindow 
{ 
    return YES; 
} 

- (BOOL)isKeyWindow 
{ 
    return ([NSApp isActive]) ? YES : [super isKeyWindow]; 
} 

這個子類的檢查,如果應用程序是活動的,如果是,它總是返回YES因此,無論什麼窗口被激活在你的應用程序中,主窗口將始終表現爲它仍然是關鍵。這種錯覺讓您可以同時擁有多個窗口,並使您能夠將關鍵窗口狀態切換到另一個窗口,而不會在主窗口上丟失。希望這可以幫助!

+0

太棒了。保存了我的早晨。謝謝! – 2012-03-08 16:31:29

相關問題