出现后无法关闭视图控制器

Posted

技术标签:

【中文标题】出现后无法关闭视图控制器【英文标题】:Cant dismiss view controller after present it 【发布时间】:2018-09-13 03:05:38 【问题描述】:

呈现标签栏控制器后,我无法关闭标签栏控制器。 在不删除应用程序的情况下重新安装后,我什至无法点击我的按钮。需要卸载并重新安装应用程序,然后我才能点击按钮

我已经尝试了一些其他方式来关闭标签栏控制器,但仍然无法关闭控制器。

这是我目前在登录后展示控制器的方式

let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
let loginVC = storyboard.instantiateViewController(withIdentifier: "Home")
self.present(loginVC, animated: true, completion: nil)

这是我目前关闭控制器的方式

@IBAction func btnLogout_TouchUpInside(_ sender: Any) 
    dismiss(animated: true, completion: nil)
  

这是我的根视图

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        if defaults.bool(forKey: "isLoggedIn") 
            // Show Home screen
            window?.rootViewController = storyboard.instantiateViewController(withIdentifier: "Home")

         else 
            // Show Login screen
            window?.rootViewController = storyboard.instantiateViewController(withIdentifier: "Login")
        
        window?.makeKeyAndVisible()

【问题讨论】:

您的代码没有明显的问题。然而,它也并不完全清楚。我们不需要查看 cookie 和钥匙串的东西,因为它们不相关。我们确实需要知道您在何时何地运行代码来加载登录。注销在哪个屏幕上?我之前在 Code 中看到过类似的问题,它使用多个 UIWindow 实例并错误管理它们,所以我还要问你是否正在做类似的事情,或者可能切换根视图控制器。 它可能是我的 rootview 控制器吗?我确实在 AppDelegate 中做了一些检查。如果有用户立即显示标签栏控制器,否则显示登录视图控制器 【参考方案1】:

尝试关闭所有可能对您有用的控制器

DispatchQueue.main.async 
    self.view.window!.rootViewController?.dismiss(animated: true, completion: 
       print("All controller dismissed successfully..")
    )

【讨论】:

之前试过这个代码。它仅在第一次登录时有效,我可以注销。如果有现有的登录用户并显示主屏幕。我无法点击注销按钮 @HanafiHisyam 如果您的控制器出现,那么这段代码应该可以工作,因为它正在关闭窗口的所有控制器,您现在应该再次尝试这段代码。【参考方案2】:

试试这个

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

【讨论】:

【参考方案3】:

嗯。尽管我仍然不确定发生了什么,但您的更新会有所帮助。我的猜测是您将登录设置为 root,然后显示主页。但我不确定你在哪里或试图解雇什么。如果它在登录中,则没有什么可以关闭的,因为它是根视图控制器。

我的建议是重新配置故事板。因为您手动呈现视图控制器,所以我将假设情节提要不包含控制器之间的任何 segue。我建议添加 segues 并使用它们。

我将主视图控制器设置为初始视图控制器,并将主故事板设置为要在应用程序设置中加载的故事板。然后可以删除所有加载情节提要和设置根视图控制器的代码。

接下来我会从主视图控制器到登录视图控制器进行手动模态segue。然后在主视图控制器的 viewDidAppear 中,我将添加代码来决定是否需要登录,并对他们执行登录 segue。

然后在登录视图控制器中,您可以执行关闭操作,它将删除模型登录视图。

这只是执行此操作的众多方法之一,但它几乎是最简单的方法。您不需要任何代码来加载或设置根视图控制器或其他任何东西。它只是让故事板为您完成工作。

【讨论】:

以上是关于出现后无法关闭视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 SKScene 呈现后无法关闭视图控制器

为啥我在关闭视图控制器后无法显示我的 Facebook 插页式广告?

无法关闭视图控制器

关闭模态视图控制器后呈现不同的视图控制器

状态栏在关闭模式视图后保持隐藏并在几秒钟后出现

在关闭另一个模式视图控制器后呈现一个模式视图控制器