如何在Swift中关闭视图控制器?

244
我试图通过在 IBAction 中调用 dismissViewController 来关闭一个 Swift 中的 ViewController。
  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

随机Segue的图片

我可以在控制台输出中看到println消息,但是视图控制器从未被解除。可能问题是什么?


2
你是如何呈现视图控制器的? - dasdom
我通过设置一个segue - “show”来完成映射,详见附加的截图。 - rshankar
4
请使用 modal。如果使用 push,则应该用导航控制器的 pop 方法将其关闭。 - dasdom
20个回答

6

由于您使用了推送呈现的视图控制器,因此可以使用

self.dismiss(animated: false, completion: nil)

5

不要从“Cancel”或“Done”创建任何转场到其他VC,并且只需在您的按钮@IBAction中编写此代码

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

5

如果您在父VC中使用当前方法,则应调用此函数来关闭子VC,请使用此方式

self.dismiss(animated: true, completion: nil)

如果你使用 push 方法调用子视图控制器,在关闭子视图控制器时,请使用以下方法。
self.navigationController?.popViewController(animated: true)

4

以下是一种将当前视图控制器关闭并返回到上一个视图控制器的方法,您只能通过Storyboard完成此操作。

  1. 打开Storyboard
  2. 右键单击取消按钮并将其拖到以前的视图控制器上,即您要返回到以前的控制器的位置
  3. 现在释放右键单击,您可以看到在取消按钮上执行的某些操作
  4. 现在从列表中选择“popover present”选项
  5. 现在您可以通过单击取消按钮来关闭当前视图

请尝试此方法,它对我有效。

第二种方法 - 使用 - navigationController.popViewControllerAnimated(true)

祝你好运。


有关编程的内容翻译成中文:http://stackoverflow.com/questions/30840235/cant-dismiss-my-previous-alertcontroller-completely。有帮助的话,请帮忙解决一下,我已经卡在这里很久了,还是找不到解决方案。 - Thiha Aung
3
这是错误的。你从未关闭当前视图,而是在当前视图之上呈现了一个新的视图控制器,导致内存泄漏。这很可能会导致你的应用被应用商店拒绝。 - 3366784

3

试试这个:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

名为“dismissViewController”的方法只需要一个参数,我想这个参数看起来像是以动画形式关闭到前一个视图,这是最简单的解决方案。 - user6378925

3

请注意,您可能会误关闭错误的视图控制器。例如,如果您在另一个模态框上方显示警报框或模态框(例如,您可能在当前模态警报框上方显示Twitter帖子警报框)。在这种情况下,您需要调用两次dismiss,或使用unwind segue。


2

在Swift 3.0中

如果你想关闭一个已经展示的视图控制器

self.dismiss(animated: true, completion: nil)

2
在Swift 4.1和Xcode 9.4.1中,如果您使用pushViewController来呈现新的视图控制器,请使用以下代码:
self.navigationController?.popViewController(animated: false)

另一个复制粘贴的答案 - J. Doe

2

如果您正在以模态方式呈现一个ViewController,并希望返回到根ViewController,请注意在返回根ViewController之前解除此模态呈现的ViewController,否则该ViewController将不会从内存中删除并导致内存泄漏。


2
@IBAction func back(_ sender: Any) {
        self.dismiss(animated: false, completion: nil)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接