如何在Swift中解除ViewController?

时间:2014-07-10 05:02:42

标签: ios swift viewcontroller

我试图通过在dismissViewController

中调用IBAction来解除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")
}

random image of a segue

我可以在控制台输出中看到println消息,但ViewController永远不会被解雇。可能是什么问题呢?

20 个答案:

答案 0 :(得分:365)

从你的图片看来,你似乎是使用push

呈现了ViewController

dismissViewControllerAnimated用于关闭使用模态

显示的ViewControllers

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

答案 1 :(得分:160)

我有一个解决您问题的方法。如果使用模态显示视图,请尝试使用此代码关闭视图控制器:

斯威夫特3:

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

OR

如果您使用" push"来呈现视图SEGUE

self.navigationController?.popViewController(animated: true)

答案 2 :(得分:19)

如果你这样做我猜你可能不会在控制台中收到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")
  }    
}

答案 3 :(得分:13)

  1. 在NavigationController中嵌入您要关闭的视图
  2. 添加一个BarButton,其中“Done”为标识符
  3. 在选择完成按钮
  4. 的情况下调用助理编辑器
  5. 为此按钮创建IBAction
  6. 将此行添加到括号中:

    self.dismissViewControllerAnimated(true, completion: nil)
    

答案 4 :(得分:12)

在Swift 3.0到4.0中,就像在函数中输入一样简单:

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

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

self.navigationController?.popViewController(animated: true)

答案 5 :(得分:11)

使用:

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

而不是:

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

答案 6 :(得分:7)

如果您展示的控制器没有导航控制器,您可以从所提供控制器的方法调用以下代码。

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

如果您的ViewController是以模态方式呈现的,则可选的presentsViewController将不是nil,代码将被执行。

答案 7 :(得分:6)

根据我的经验,我添加了一个方法来解雇我作为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)
   }
   ...
}

答案 8 :(得分:5)

从苹果documentations

  

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

因此,仅从自身调用dismiss方法是一种不好的做法。

如果要呈现模式,应该做的是:

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

答案 9 :(得分:4)

不要在取消或完成其他VC 中创建任何segue,只需将此代码写入您的按钮@IBAction

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

答案 10 :(得分:3)

这是解除当前视图控制器并移回上一个视图控制器的一种方法。您只能通过Storyboard执行此操作。

  1. 打开故事板
  2. 右键单击“取消”按钮并将其拖动到上一个视图控制器,您想要移回到上一个控制器
  3. 现在发布右键单击,您可以看到一些在取消按钮上执行的操作
  4. 现在选择" popover present"列表中的选项
  5. 现在,您可以点击取消按钮
  6. 来关闭当前视图

    请试试这个,它和我一起工作。

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

    祝你好运..

答案 11 :(得分:3)

由于您使用了推送呈现的viewController,因此可以使用

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

答案 12 :(得分:2)

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

答案 13 :(得分:2)

如果您在父级VC中使用present方法,则应调用此函数,使用此功能可关闭子级VC

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

如果您使用push方法调用子VC,请使用此方法关闭子VC

self.navigationController?.popViewController(animated: true)

答案 14 :(得分:1)

如果你以模态方式呈现ViewController,并且想要返回到根ViewController,请在返回到根ViewController之前关注这个模态呈现的ViewController,否则不会从内存中删除此ViewController并导致内存泄漏

答案 15 :(得分:1)

在Swift 3.0中

如果要关闭呈现的视图控制器

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

答案 16 :(得分:1)

在Swift 4.1和Xcode 9.4.1中

如果您使用pushViewController展示新的视图控制器,请使用此

self.navigationController?.popViewController(animated: false)

答案 17 :(得分:1)

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

答案 18 :(得分:0)

此代码以按钮操作写入以解除

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

答案 19 :(得分:0)

尝试一下:

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