2014-08-05 4 views
0

Я хочу знать, как закрыть NSPopover программно, не прикасаясь снаружи, потому что я хочу, чтобы назначить его к действию (например, KeyDown Введите ключ или другой ярлык)Как закрыть NSPopover программно

, потому что я открываю NSPopover с ярлыком, было бы более логично было бы закрыть, нажав другую команду

поделимся мой код:

EdiciondeCuentasWC.h (NSWindowController), откуда я называю мой NSPopover

#import "EdicionDeCuentasWC.h" 
#import "CambiarTipoCuentaVC.h" 
@interface EdicionDeCuentasWC()<NSPopoverDelegate>{ 
    CambiarTipoCuentaVC   *cambiarTipoCuentaVC; 
} 
@property (strong) IBOutlet NSPopover *popoverClasifCuentas; 

@end 


@implementation EdicionDeCuentasWC 

-(void)mostrarPopupCambiarTipoCta{ 

     cambiarTipoCuentaVC = (CambiarTipoCuentaVC *) _popoverCambiarTipoCuentas.contentViewController; 
     cambiarTipoCuentaVC.nombre_tipo_cta = arrayActivos[renglonSeleccionado][@"nombre_tipo_cta"]; 
     cambiarTipoCuentaVC.prioridad_cta = arrayActivos[renglonSeleccionado][@"prioridad_cta"]; 

     NSTableCellView *cellView = [_activoTableView viewAtColumn:0 
                   row:renglonSeleccionado 
                makeIfNecessary:NO]; 

     [_popoverClasifCuentas  setDelegate:self]; 
     [cambiarTipoCuentaVC  inicializarDatos]; 
     [_popoverCambiarTipoCuentas showRelativeToRect:[cellView bounds] ofView:cellView preferredEdge:NSMaxXEdge]; 
} 

#pragma mark NSPopoverDelegate 
-(void)popoverWillClose:(NSNotification *)notification{ 

    NSPopover *popover = (NSPopover *)[notification object]; //there I have the code for managing all the returning parameters... 

} 

@end 

И код моего NSPopover находится внутри NSViewController (CambiarTipoCuentaVC), но внутри там нет ни [self close], ни [self performClose], чтобы закрыть его от кнопки или ярлыка, любая помощь, чтобы заставить ее работать. I 'd оценить ...

ответ

6

Вы даже посмотрели до NSPopover документации? Он имеет метод -close и, для немного иной цели, метод -performClose:.

+1

вещь ... У меня есть все мои программы внутри NSViewController, и нет ни [self close], ни [self performClose], чтобы загрузить мой код. – Jesus

+0

Сообщениям не нужно идти в 'self'. Учитывая, что у вас есть ссылка на popover, вы можете отправить ему сообщение, используя эту ссылку. –

2

Я нашел, как, я собираюсь дополнить ответ Ken Thomases в

Я создал подкласс NSPopover называется MyNSPopover

Затем я добавил следующий код:

#import "MyNSPopover.h" 

@implementation MyNSPopover 

-(void)keyDown:(NSEvent *)theEvent{ 

    //if enter key is pressed, the NSPopup will be closed 
    if (theEvent.keyCode == 36) { 
     [self close]; 
    } 
} 

@end 

, а затем только что добавил этот класс к моему NSPповерю подобным образом

enter image description here

сделано только работает

9

Я столкнулся с этим сообщением и хотел поделиться своим решением.

> Macos 10,10, Swift 4

С Macos 10.10 Вы можете позвонить

presentViewController(_ viewController: NSViewController, asPopoverRelativeTo positioningRect: NSRect, of positioningView: NSView, preferredEdge: NSRectEdge, behavior: NSPopoverBehavior) 

на NSViewController представить другой View Controller, как пирог.

Когда вы это сделаете, представляющий View Controller доступен через свойство presenting. Таким образом, вам нужно только позвонить presenting?.dismissViewController(self), чтобы отклонить popover.

Я надеюсь, что это поможет любому, кто ищет современное решение этой проблемы.