2014-01-16 80 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设置回编辑控件也是一种可能的选择。显示弹出窗口不会改变视觉外观,因此短焦点开关不会闪烁。