如何解散ViewController在Swift?

我试图通过在IBAction中调用dismissViewController来快速解散一个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")
}

random image of a segue

我可以在控制台输出中看到println消息,但ViewController从未被解散。有什么问题吗?

382241 次浏览

我有办法解决你的问题。如果你使用模态显示视图,请尝试下面的代码来解除视图控制器:

斯威夫特3:

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

如果你使用push segue来呈现视图

self.navigationController?.popViewController(animated: true)

从你的图片来看,你似乎是用push来呈现ViewController的

dismissViewControllerAnimated用于关闭使用模态显示的viewcontroller

斯威夫特2

navigationController.popViewControllerAnimated(true)

斯威夫特4

navigationController?.popViewController(animated: true)


dismiss(animated: true, completion: nil)

这是一种方法来解散当前的视图控制器并移回之前的视图控制器。您只能通过故事板来实现这一点。

  1. 开放的故事板
  2. 右键单击取消按钮并将其拖到前一个视图控制器,在那里您想移动回前一个控制器
  3. 现在释放右键点击,你可以看到一些行动执行取消按钮
  4. 现在从列表中选择“弹出窗口呈现”选项
  5. 现在你可以通过点击取消按钮来取消当前视图

请试试这个,它对我很有效。

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

最好的运气. .

如果你这样做,我猜你可能不会在控制台得到println消息,

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


@IBAction func done(sender: AnyObject) {
if(self.presentingViewController){
self.dismissViewControllerAnimated(false, completion: nil)
println("done")
}
}
  1. 将你想要解散的视图嵌入到一个NavigationController中
  2. 添加一个BarButton与“完成”作为标识符
  3. 使用选定的Done按钮调用助理编辑器
  4. 为这个按钮创建一个IBAction
  5. 将这一行添加到括号中:

    self.dismissViewControllerAnimated(true, completion: nil)
    

使用:

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

而不是:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

作为参考,请注意您可能正在解散错误的视图控制器。例如,如果你有一个警告框或模式显示在另一个模式之上。(例如,您可以在当前模式警报的顶部显示Twitter帖子警报)。在这种情况下,您需要调用两次dismiss,或者使用一个unwind segue。

如果你呈现一个没有导航控制器的控制器,你可以从呈现控制器的一个方法调用下面的代码。

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

如果你的ViewController是模态呈现的,可选的presentingViewController将不是nil,代码将被执行。

如果你正在以模态方式呈现一个ViewController,并且想要回到根ViewController,在你回到根ViewController之前,注意解散这个模态呈现的ViewController,否则这个ViewController将不会从内存中移除,并导致内存泄漏。

不创建任何从取消或完成到其他VC的segue和只写这个代码你的按钮@IBAction

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

在Swift 3.0到4.0中,只需在函数中输入以下内容即可:

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

或者如果你在导航控制器中,你可以“弹出”它:

self.navigationController?.popViewController(animated: true)

根据我的经验,我添加了一个方法来解散我作为UIViewController的扩展:

extension UIViewController {
func dismissMe(animated: Bool, completion: (()->())?) {
var count = 0
if let c = self.navigationController?.viewControllers.count {
count = c
}
if count > 1 {
self.navigationController?.popViewController(animated: animated)
if let handler = completion {
handler()
}
} else {
dismiss(animated: animated, completion: completion)
}
}
}

然后我调用这个方法来解散任何UIViewController子类中的视图控制器。例如,在取消动作中:

class MyViewController: UIViewController {
...
@IBAction func cancel(sender: AnyObject) {
dismissMe(animated: true, completion: nil)
}
...
}

如果你想解散你的视图控制器使用这个。这段代码是用按钮动作来编写的,以消除VC

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

在Swift 3.0中

如果你想解散一个呈现的视图控制器

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

在Swift 4.1和Xcode 9.4.1中

如果你使用pushViewController来呈现新的视图控制器,使用这个

self.navigationController?.popViewController(animated: false)

来自Apple 文件:

呈现视图控制器负责解散它呈现的视图控制器

因此,只从驳回方法自身调用是一个不好的做法。

如果你是模态呈现,你应该做的是:

presentingViewController?.dismiss(animated: true, completion: nil)

试试这个:

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

如果你在父VC中使用当前方法,那么你应该调用这个函数,来解散子VC

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

如果你用push方法调用子VC,用这个方法来解散子VC

self.navigationController?.popViewController(animated: true)

因为你使用了push presenting viewController,因此,你可以使用

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