2013-12-22 42 views
7

我試圖複製iTunes中的搜索字段的行爲,查找股票的符號和名稱。具體來說,當您開始在搜索字段中輸入時,彈出窗口會顯示已過濾的項目。大多數情況下,我有這個工作,但我無法複製的是它處理急救員的方式 enter image description here如何處理急救人員和NSPopover

我輸入三個字符後出現彈出窗口。此時NSSearchField將失去第一個響應者狀態,因此我不能再繼續輸入。我想要的行爲是 在彈出窗口出現後繼續打字的能力 如果使用箭頭鍵滾動瀏覽項目,然後繼續打字,則可以從「搜索」字段中的最後一個字符繼續。

我試過被繼承NSTextView(以此爲自定義字段編輯器的NSSearchField)和壓倒一切的

- (BOOL)resignFirstResponder 

通過返回NO,我能繼續出現酥料餅輸入一次,但很明顯,我可以」 t選擇彈出窗口中的任何項目。所以我嘗試了以下,如果向下箭頭或mousedown事件發生,返回YES。

@interface SBCustomFieldEditor() 
{ 
    BOOL resignFirstRepond; 
} 
@end 

@implementation SBCustomFieldEditor 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
     resignFirstRepond = NO; 
    } 
    return self; 
} 

- (BOOL)resignFirstResponder 
{ 
    return resignFirstRepond; 
} 

- (void)keyDown:(NSEvent *)theEvent 
{ 
    if ([theEvent keyCode] == 125) { 
     resignFirstRepond = YES; 
     [self resignFirstResponder]; 
    } 
    [super keyDown:theEvent]; 
} 

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    resignFirstRepond = YES; 
    [self resignFirstResponder]; 
} 

這適用於mousedown事件,但不適用於keydown事件,此外,這不能解決問題,當用戶恢復鍵入時。

有什麼建議嗎?

+0

您是否嘗試將NSPopoverBehaviorApplicationDefined設置爲行爲。我認爲其他兩種行爲可能依靠第一響應者開關來正確處理關閉彈窗。此外,我假設您已經嘗試在彈出窗口出現後手動將第一個響應者狀態設置爲文本字段。 –

+0

@MikeLischke當你說「手動」,你的意思是在應用程序運行時單擊搜索字段?如果是這樣,那是行得通的。或者你的意思是使用類似setNextResponder的東西? – Cory

+0

不,我的意思是'NSWindow makeFirstResponder:'。您可以在使彈出窗口可見之後調用它(通過'performSelector:withObject:afterDelay:0'將其安排到下一個運行循環中)。 –

回答

0

在此期間,我發現一個簡單的修復。子類化您的文本視圖並執行- (BOOL)canBecomeKeyView。總是在那裏返回NO。彈出窗口顯示時,它只會被調用一次。您可以隨時使用文本視圖。