1

我想知道如何以编程方式关闭 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) 内部,但在里面我既没有 [self close] 也没有 [self performClose] 从按钮或快捷方式关闭它,任何帮助使其工作我会很感激...

4

4 回答 4

19

我遇到了这篇文章,想分享我的解决方案。

>macOS 10.10、斯威夫特 4

从 macOS 10.10 开始,您可以调用

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

NSViewController将另一个 View Controller 呈现为弹出框。

当您这样做时,呈现的视图控制器可通过该presenting属性获得。因此,您只需要调用 presenting?.dismissViewController(self)即可关闭弹出框。

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

于 2017-02-24T19:45:22.607 回答
8

您甚至看过NSPopover文档吗?它有一种-close方法,并且出于稍微不同的目的,还有-performClose:一种方法。

于 2014-08-06T00:06:11.020 回答
3

您要关闭的是弹出窗口的窗口,因此您可以简单地添加

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

到您的弹出窗口的视图控制器,不需要子类化。

(Xcode 10、macOS 10.13、Swift 4.1)

编辑添加: 我现在已经尝试使用 JanApotheker 的解决方案presentingViewController?.dismiss(self),它只是比我的更快更流畅,所以我不再推荐它。

于 2018-06-14T16:04:10.363 回答
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

在此处输入图像描述

完成只是工作

于 2014-08-06T17:28:28.157 回答