我想知道如何以编程方式关闭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)内,但在那里,我没有[自我关闭]或[自我执行关闭]使它从按钮或快捷方式关闭,任何帮助让它发挥作用我很欣赏......
答案 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中,就像这样
完成工作
答案 3 :(得分:0)
您要关闭的是弹出框的窗口,因此您只需添加
即可@IBAction func closePopover(_ sender: Any) {
self.view.window?.performClose(sender)
}
到你的popover的视图控制器,不需要子类化。
(Xcode 10,macOS 10.13,Swift 4.1)