2012-04-16 83 views
2

我有一個NSStatusItem顯示NSPopover包含NSTextField,但文本字段不可編輯,雖然它已如此如此在Xcode。現在這是一個已知的錯誤,顯然有人發佈了一個解決方案here。我真的需要解決這個錯誤。NSStatusItem與NSPopover和NSTextField

我只是引用答案在這裏爲了方便:

的主要問題是鍵盤事件的工作方式。儘管NSTextField(以及他的所有超級視圖)接收鍵盤事件,但他沒有采取任何行動。發生這種情況的原因是彈出窗口的位置存在於無法成爲關鍵窗口的窗口中。你不能以任何方式訪問該窗口,至少我不能。所以解決方案是使用一個類別覆蓋我們應用程序中每個NSWindow的方法canBecomeKeyWindow。

NSWindow+canBecomeKeyWindow.h 
@interface NSWindow (canBecomeKeyWindow) 

@end 

NSWindow+canBecomeKeyWindow.m 
@implementation NSWindow (canBecomeKeyWindow) 

//This is to fix a bug with 10.7 where an NSPopover with a text field cannot be edited if its parent window won't become key 
//The pragma statements disable the corresponding warning for overriding an already-implemented method 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 
- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 
#pragma clang diagnostic pop 

@end 

這使得酥料餅完全resposive。如果您需要另一個必須對canBecomeKeyWindow作出響應的窗口,則可以始終創建一個子類。

我真的不明白我應該做什麼。我只是創建這兩個文件NSWindow + canBecomeKeyWindow(.h和.m),這將做到這一點?因爲它不適合我。

我不確定這個問題,但是如果我實際上使用的是顯示NSPopover的NSWindow,那麼這樣做是否可行?我沒有使用NSWindow,我怎樣才能讓NSTextField可編輯?

謝謝。

回答

3

是的,只需將NSWindow + canBecomeKeyWindow(.h和.m)文件添加到您的項目,它應該工作。我在我正在開發的應用程序中使用這種技術,並且工作正常。確保NSWindow + canBecomeKeyWindow.m在項目構建階段的「編譯源代碼」下列出。

順便說一句,我有其他問題使用NSPopover從NSStatusItem顯示窗口。我實際上沒有嘗試在我的項目中使用它,但this看起來很有希望作爲替代方案。

+0

謝謝你的回答。我希望蘋果能儘快解決這個問題。我也在尋找替代品,但我寧願依靠蘋果的代碼,因爲其他人未來可能不會更新他們的代碼。 – iMaddin 2012-05-03 12:50:16