2014-01-16 70 views
0

我正在創造一個智能感知風格酥料餅,顯示誰正在輸入到文本字段什麼語法有效用戶。有誰知道如何顯示NSPopover而不讓它聚焦,以便用戶可以繼續輸入到textField中?該酥料餅是由controlTextDidChange觸發:顯示NSPopover沒有焦點

- (void) controlTextDidChange:(NSNotification *)obj 
{ 

    NSTextField *field = [obj object]; 
    NSString *command = [field stringValue]; 

    if ([[command substringFromIndex: command.length - 1] isEqualToString: @"#"]){ 
     CompletionMenuController *completionController = [[CompletionMenuController alloc] initWithNibName: @"CompletionMenuController" bundle:[NSBundle mainBundle]]; 
     completionMenuPopover = [[NSPopoverInformation alloc] init]; 
     [completionMenuPopover setContentViewController: completionController]; 
     [completionMenuPopover setContentSize: completionController.view.frame.size]; 
     [completionMenuPopover setBehavior: NSPopoverBehaviorTransient]; 
     [completionMenuPopover setAppearance: NSPopoverAppearanceHUD]; 
     [completionMenuPopover showRelativeToRect:[_commandBar frame] ofView:_commandBar preferredEdge:NSMaxYEdge]; 
    } 
} 
+0

'[textView becomeFirstResponder];'顯示彈出窗口後? – nhgrif

+0

@nhgrif請閱讀關於'-becomeFirstResponder'的文檔。除此之外,將焦點重新放在文本視圖上並不等同於不失焦點。 –

+0

我發佈的問題評論,而不是一個答案。我不知道它是否有用,因此它不作爲答案發布。這是一段非常簡單的代碼,用於輸入並查看它是否有效,這是我在發佈此問題之前嘗試的第一件事。提問者沒有提到嘗試它,所以我認爲這值得一試。 – nhgrif

回答

1

這是一種解決方法,我不完全是如何試圖做到這一點,但它的作品。在打開彈出窗口之前,我將光標位置保存在文本字段中,然後給文本字段第一響應者並將光標位置改回原來的位置。

if ([_commandBar stringValue].length > 0){ 
    NSString *command = [_commandBar stringValue]; 
    NSRange range  = [[_commandBar currentEditor] selectedRange]; 

    //Open popover if command is being typed 
    if ([[command substringFromIndex: command.length - 1] isEqualToString: @"#"]){ 
     CompletionMenuController *completionController = [[CompletionMenuController alloc] initWithNibName: @"CompletionMenuController" bundle:[NSBundle mainBundle]]; 

     //Configure and Open Popover 
     if ([completionMenuPopover isShown]) [completionMenuPopover close]; 
     completionMenuPopover = [[NSPopover alloc] init]; 
     [completionMenuPopover setContentViewController: completionController]; 
     [completionMenuPopover setContentSize: completionController.view.frame.size]; 
     [completionMenuPopover setBehavior: NSPopoverBehaviorTransient]; 
     [completionMenuPopover setAppearance: NSPopoverAppearanceHUD]; 
     [completionMenuPopover setAnimates: NO]; 
     [completionMenuPopover showRelativeToRect:[_commandBar frame] ofView:_commandBar preferredEdge:NSMaxYEdge]; 

     //Reset Command Bar as First Responder 
     [_commandBar becomeFirstResponder]; 
     [[_commandBar currentEditor] setSelectedRange: range]; 
    } 
} 
0

NSPopover的自動關閉似乎取決於檢測重點的變化。這意味着它需要將第一響應者狀態設置爲popover,如果它是瞬態的。嘗試NSPopoverBehaviorApplicationDefined,看看是否解決了焦點問題。但是,您必須小心關閉彈出式窗口。如果沒有其他方法,明確地將foc設置回編輯控件也是一種可能的選擇。顯示彈出窗口不會改變視覺外觀,因此短焦點開關不會閃爍。