您能否以编程方式关闭视图控制器而无需按钮? - OS X.

时间:2016-06-30 14:55:33

标签: xcode swift macos user-interface cocoa

我正在尝试以编程方式关闭我的Cocoa App中的视图控制器。这可能吗?我在Objective-C中看到了一篇关于它的帖子,但我还没能找到一个在Swift中运行的帖子。我在函数中尝试了这段代码,然后调用了函数。self.dismissViewController(self)然而它给了我SIGABRT。我不希望用户必须按下按钮或执行任何操作,但只需让后控制器关闭一次我"显示"下一个视图控制器(我有一个自动按下的IBOutlet按钮,它自动将视图发送到下一页,但似乎无法关闭当前页面)。是否有关闭父视图控制器的工作代码?

5 个答案:

答案 0 :(得分:4)

所以我想出了如何让它发挥作用 - 感谢大家的建议。这对我有用 - 我将故事板上的按钮连接为Outlet(点击本身)和一个函数(关闭自身),然后将按钮的不透明度设置为0,这样它就不可见了。我必须特别喜欢并添加一个NSTimer来点击它,因为我需要它以编程方式打开另一个视图控制器才能关闭它。希望这有助于将来的某个人!

 class Begin: NSViewController {
   @IBOutlet var close: NSButton!

override func viewWillAppear() {

     NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(click), userInfo: nil, repeats: true)
 }

func click() {
    close.performClick(nil)
}


override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func close(sender: AnyObject) {
    self.view.window?.close()
}
} 

答案 1 :(得分:0)

如果是模型vc,你可以尝试[self dismissViewControllerAnimated:YES completion:nil];或者你可以打开另一个vc [self dismissViewControllerAnimated:YES completion:nil];

答案 2 :(得分:0)

正如您在此处所述,您可能正在使用navigationController,我是对的吗?如果是这样,你可以尝试navigationController.popViewControllerAnimated(animated:Bool)

希望这可以帮助你,亲切的问候。

答案 3 :(得分:0)

我使用此命令(目标c)。这非常有用。

self.view.window.close;

答案 4 :(得分:0)

这是由于 NSWindow 在您向其发送关闭消息时会自动释放。 NSWindow 有一个属性releasedWhenClosed,默认为YES。将其设置为 NO,并且窗口在关闭时NOT 不会被释放,并且您不会崩溃。我所做的是实现一个委托,当用户单击按钮(它是一个无边框窗口)时调用该委托,委托向窗口发送关闭消息。但是,我发现即使是在该窗口中显示视图的视图控制器也可以安全地使用 [self.view.window close] 发出关闭;如果 Window.releasedWhenClosed 为否。我的项目中的一些代码:

@property (nonatomic,strong) AuController *auViewController;
@property (nonatomic,strong) NSWindow *auWindow;

- (void)mustCloseWindow_auViewControllerDelegate
{
    [self.auWindow close];
    self.auWindow = nil;
}

视图确实:

self.auWindow = [[NSWindow alloc] initWithContentRect:Prefs.screenRectOriginalOrigin styleMask:(NSWindowStyleMaskBorderless) backing:NSBackingStoreBuffered defer:NO];

    self.auWindow.releasedWhenClosed = NO;

    self.auViewController = [[AuViewController alloc] initWithNibName:@"AuViewController.nib" bundle:nil];
    self.auViewController.delegate = self;  // e.g. to get the close action
    [self addSubview:self.auViewController.view];
    
    self.auWindow.contentView = self.auViewController.view;