我试图通过在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")
}
我可以在控制台输出中看到println消息,但ViewController永远不会被解雇。可能是什么问题呢?
答案 0 :(得分:365)
从你的图片看来,你似乎是使用push
呈现了ViewController dismissViewControllerAnimated
用于关闭使用模态
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)
将此行添加到括号中:
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执行此操作。
请试试这个,它和我一起工作。
第二种方式 - 使用 - 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)
}