如何在 Swift 中关闭 ViewController?

Posted

技术标签:

【中文标题】如何在 Swift 中关闭 ViewController?【英文标题】:How to dismiss ViewController in Swift? 【发布时间】:2014-08-31 08:56:20 【问题描述】:

我正在尝试通过在 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")

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

【问题讨论】:

你是如何展示视图控制器的? 我通过设置一个 segue 进行映射 - “显示”,请参见随附的屏幕截图。 尝试使用模态。如果你使用 push,你应该使用导航控制器的 pop 方法将其关闭。 【参考方案1】:

从您的图片看来,您似乎使用 push 呈现了 ViewController

dismissViewControllerAnimated 用于关闭使用 modal 呈现的 ViewControllers

斯威夫特 2

navigationController.popViewControllerAnimated(true)

斯威夫特 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

【讨论】:

“Show Detail”转场你会怎么做? 对于 Swift 2.2 navigationController!.popViewControllerAnimated(true) 对于 Swift 3 navigationController!.popViewController(animated: true)【参考方案2】:

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

斯威夫特 3:

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

如果您使用“推”segue 呈现视图

self.navigationController?.popViewController(animated: true)

【讨论】:

谢谢,但结果还是一样,它不会关闭 ViewController 这与 OP 使用的方法有何不同? 如果你不回答我的问题,对话是没有用的。 _ = self.navigationController?.popViewController(animated: true)【参考方案3】:

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

【讨论】:

***.com/questions/30840235/…。请问有什么帮助吗?我被困了这么久谁仍然找不到解决方案【参考方案4】:

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

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

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

self.navigationController?.popViewController(animated: true)

【讨论】:

dismiss 不起作用,因为我正在使用 pushViewController。只有 self.navigationController?.popViewController(animated: true) 工作。【参考方案5】:
    将要关闭的视图嵌入到 NavigationController 中 添加一个以“完成”为标识符的 BarButton 在选中“完成”按钮的情况下调用助理编辑器 为此按钮创建一个 IBAction

    将此行添加到括号中:

    self.dismissViewControllerAnimated(true, completion: nil)
    

【讨论】:

【参考方案6】:

用途:

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

代替:

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

【讨论】:

添加一个!到导航控制器,它对我有用 @naturalc:请注意,如果 navigationController 为 nil 并且您输入 !,应用程序将崩溃【参考方案7】:

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

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

如果你的 ViewController 是模态显示的,可选的 presentingViewController 将不是 nil 并且代码将被执行。

【讨论】:

【参考方案8】:

来自苹果documentations:

呈现视图控制器负责关闭它呈现的视图控制器

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

如果您以模态形式呈现它,您应该做的是:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

这是关闭当前视图控制器并返回到前一个视图控制器的一种方法。您只能通过 Storyboard 执行此操作。

    打开故事板 右键单击“取消”按钮并将其拖动到上一个视图控制器,您要在此处移回上一个控制器 现在松开右键,您可以看到取消按钮上执行的一些操作 现在从列表中选择“popover present”选项 现在您可以通过单击取消按钮来关闭当前视图

请试试这个,它对我有用。

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

祝你好运..

【讨论】:

***.com/questions/30840235/…。请问有什么帮助吗?我被困了这么久谁仍然找不到解决方案 这是错误的。您永远不会关闭视图,而是在当前视图控制器之上呈现一个新的视图控制器,从而导致内存泄漏。这很可能会导致您的应用被应用商店拒绝。【参考方案12】:

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

试试这个:

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

【讨论】:

名为“dismissViewController”的方法只需要一个参数,我想这看起来像是将动画关闭到上一个视图,这是最简单的解决方案。【参考方案15】:

如果您在父 VC 中使用 present 方法,那么您应该调用此函数,以关闭子 VC 使用此

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

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

self.navigationController?.popViewController(animated: true)

【讨论】:

【参考方案16】:

所以如果你想关闭你的 Viewcontroller 使用这个。这段代码写在按钮动作中以关闭 VC

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

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案17】:

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

【讨论】:

【参考方案18】:

在 Swift 3.0 中

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

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

【讨论】:

【参考方案19】:

在 Swift 4.1 和 Xcode 9.4.1 中

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

self.navigationController?.popViewController(animated: false)

【讨论】:

另一个复制粘贴答案【参考方案20】:
@IBAction func back(_ sender: Any) 
        self.dismiss(animated: false, completion: nil)
    

【讨论】:

以上是关于如何在 Swift 中关闭 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中关闭和完成处理程序后获取数据

如何检查视图控制器是不是已在 Swift 中关闭

如何在 iOS + Swift 中关闭我的应用程序的 Internet 访问

在 SWIFT 中关闭 segue 之前保存变量

Swift:在 AFNetworking 调用中关闭的未包装选项

firebase 在 Swift 中关闭重载表?