2014-01-16 3 views
0

Я работаю над созданием Popover IntelliSense, в котором отображается пользователь, который вводит текстовое поле, какой синтаксис действителен. Кто-нибудь знает, как показать NSPopover, не давая ему фокус, чтобы пользователь мог продолжать вводить текст в текстовое поле? Поповер инициируется 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 beFirstResponder];' после того, как вы покажете popover? – nhgrif

+0

@nhgrif, пожалуйста, прочитайте документацию о '-becomeFirstResponder'. Кроме того, установка фокуса назад на текстовое представление не то же самое, что не потерять фокус. –

+0

Я разместил это как вопрос, а не как ответ. Я не знал, будет ли это работать или нет, поэтому он не отправлен в качестве ответа. Это очень простая строка кода для входа и посмотреть, работает ли она или нет, и это первое, что я попробую, прежде чем я опубликую этот вопрос. Вопроситель не упомянул об этом, поэтому решил, что это стоит того. – nhgrif

ответ

1

Это обходное решение, а не то, как я пытался это сделать, но он работает. Я сохраняю позицию курсора в текстовом поле до открытия popover, затем даю текстовое поле первым ответчиком и изменяю позицию курсора обратно туда, где он был.

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 кажется, зависит от обнаружения изменений фокусировки. Это означает, что для его перехода требуется установить статус первого ответчика. Попробуйте NSPopoverBehaviorApplicationDefined и посмотрите, разрешает ли это проблема фокуса. Тем не менее, вы должны позаботиться о том, чтобы закрыть popover. Однако явным образом можно вернуть фокусы в элемент управления редактирования, если это не так. Отображение popover не изменит внешний вид, поэтому для этого короткого переключателя фокусировки не будет мерцания.

 Смежные вопросы

  • Нет связанных вопросов^_^