【问题标题】:Can you programmatically close a view controller without a button? - OS X你可以在没有按钮的情况下以编程方式关闭视图控制器吗? - 操作系统
【发布时间】:2016-11-02 18:20:58
【问题描述】:

我正在尝试以编程方式关闭我的 Cocoa 应用程序中的视图控制器。这可能吗?我在 Objective-C 中看到了一篇关于它的帖子,但我一直无法找到适用于 Swift 的帖子。我已经在函数中尝试了这段代码,然后调用了函数。self.dismissViewController(self) 但是它给了我 SIGABRT。我不希望用户必须按下按钮或做任何事情,但只要我“显示”下一个视图控制器(我有一个自动将视图发送到下一页,但似乎无法关闭当前页面)。是否有关闭父视图控制器的工作代码?

【问题讨论】:

  • 看看this Q&A 能不能帮到你(见smileBot:s answer for Swift)。
  • 你如何展示这个新的视图控制器?
  • 感谢 dfri!但是,他们似乎在使用 Xcode 7 中似乎不存在的视图控制器顶部的“退出”按钮?
  • this answer 中,我展示了(带有 gif 动画)如何使用“退出”按钮,它基于 XCode 7(.3)。看看能不能帮到你;你能找到按钮吗?
  • 没关系。它们可能完全不同,我在尝试使用 OSX 的过程中学到了艰难的方法。呵呵谢谢你的帮助!

标签: xcode swift macos user-interface cocoa


【解决方案1】:

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

【讨论】:

  • 您好 Tunaki - 感谢您的回复!我究竟会把这段代码放在哪里?抱歉,我是 swift 新手。
  • 这是 Objective-C,不是 Swift。
【解决方案2】:

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

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

【讨论】:

  • 谢谢布鲁诺!它是一个 NSViewController - 有没有我可以使用的特定代码?
  • 我认为你可以直接在你的视图控制器上调用 removeFromParentViewController ,让我知道这是否正确
  • 我可以使用该代码,但它不会关闭父视图控制器。
  • 如果将另一个视图控制器显示为“显示”,它会自动成为父控制器吗?
  • 对不起,我不明白你想弹出父级。一种方法是直接从 navigationController 的堆栈中删除它。试试这个代码:navigationController!.viewControllers.removeAtIndex((navigationController?.viewControllers.count)! - 2) 我稍微解释一下,你删除了“count - 2”项,因为实际上你' 正在从数组中取出一个项目,因此最后一个项目下标是“count - 1”,因此,如果要删除前一个项目,则增加减​​法数。希望它足够清楚,我等待您的反馈
【解决方案3】:

所以我想出了如何让它发挥作用 - 感谢大家的建议。这对我有用 - 我将故事板中的按钮连接为插座(单击自身)和功能(关闭自身),并将按钮的不透明度设置为 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()
}
} 

【讨论】:

  • 虽然它更像是一个黑客修复,但它确实有效。你可能想改变 repeats: false 从 true 否则它会一直试图关闭窗口。
【解决方案4】:

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

@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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多