如何以编程方式关闭NSPopover

时间:2014-08-05 23:23:30

标签: macos xcode5.1 nspopover

我想知道如何以编程方式关闭NSPopover,而不是通过触摸外部,因为我想将其分配给某个操作(例如KeyDown Enter Key或其他快捷方式)

因为我用快捷方式打开我的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)内,但在那里,我没有[自我关闭]或[自我执行关闭]使它从按钮或快捷方式关闭,任何帮助让它发挥作用我很欣赏......

4 个答案:

答案 0 :(得分:14)

我遇到过这篇文章并希望分享我的解决方案。

  

&gt; macOS 10.10,Swift 4

从macOS 10.10开始,您可以调用

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

NSViewController上将另一个视图控制器显示为弹出窗口。

执行此操作时,可通过presenting属性显示呈现的视图控制器。因此,您只需要调用presenting?.dismissViewController(self)来解除弹出窗口。

我希望这对寻求解决此问题的现代解决方案的人有所帮助。

答案 1 :(得分:7)

你有没有看过NSPopover文件?它有一个-close方法,但为了略有不同的目的,-performClose:方法。

答案 2 :(得分:2)

我发现了如何,我将补充ken Thomases的答案

我创建了一个名为MyNSPopover的NSPopover子类

然后我添加了下一个代码:

#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

然后将此类添加到我的NSPopover中,就像这样

enter image description here

完成工作

答案 3 :(得分:0)

您要关闭的是弹出框的窗口,因此您只需添加

即可
@IBAction func closePopover(_ sender: Any) {
    self.view.window?.performClose(sender)
}

到你的popover的视图控制器,不需要子类化。

(Xcode 10,macOS 10.13,Swift 4.1)