【问题标题】:Check to specific VC in AppDelegate检查 AppDelegate 中的特定 VC
【发布时间】:2019-07-23 18:18:40
【问题描述】:

如果应用程序在前台运行,我正在尝试检查特定的 VC。我的根视图控制器类是SWRevealViewController。之后我有一个TabBarController,在它下面有NavigationControllerViewController

我的继承人是,

SWRevealViewController --> TabBar 控制器 --> 导航控制器 --> MessageVC --> ChatVC

如果应用程序在 ChatVC 上运行,我想检查应用程序委托,如果在前台运行,我已经尝试过此代码,

    let tabBar:UITabBarController = self.window?.rootViewController as! UITabBarController

    let navInTab:UINavigationController = tabBar.viewControllers?[1] as! UINavigationController

    let storyboard = UIStoryboard(name: "Dashboard", bundle: nil)
    let destinationViewController = storyboard.instantiateViewController(withIdentifier: "ChatDetailViewController") as? ChatDetailViewController

    if destinationViewController?.restorationIdentifier == "ChatDetailViewController"
    {
        print("Yes")
    }
    else
    {
        print("No")
    }

但应用程序因此错误而崩溃,

无法将“SWRevealViewController”(0x100dc4b20) 类型的值转换为“UITabBarController”(0x211b289f0)。

我如何检查应用程序是否在 ChatVC 上?

故事板截图:

【问题讨论】:

  • 检查窗口?.visibleViewController
  • 你需要签入SWRevealViewController NavigationController,而不是 TabBar NavigationController。
  • 我该如何检查? @dahiya_boy
  • 我已经设置好了,让 vc = UIStoryboard().loadSWRevealController() appDeleg.window?.rootViewController = vc appDeleg.window?.makeKeyAndVisible() 。在 DidFinish 代表中。 @KrishnaDattShukla

标签: ios swift


【解决方案1】:

我有一个扩展

extension UIApplication {

class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
    if let nav = base as? UINavigationController {
        return topViewController(base: nav.visibleViewController)
    }
    if let tab = base as? UITabBarController {
        let moreNavigationController = tab.moreNavigationController
        if let top = moreNavigationController.topViewController, top.view.window != nil {
            return topViewController(base: top)
        } else if let selected = tab.selectedViewController {
            return topViewController(base: selected)
        }
    }
    if let presented = base?.presentedViewController {
        return topViewController(base: presented)
    }
    return base
}

}

用法:

    if UIApplication.topViewController is YourViewController { 

// 做某事 }

【讨论】:

  • 我试过这个,它对我不起作用,因为我的根视图控制器是 SWRevealViewController 。 @Alexandr Kolesnik
  • 你可以尝试一些变通方法,创建带有标志的 ViewController,从 ViewController 继承所有控制器,更改 viewDidLoad 中的标志,然后检查标志
【解决方案2】:

我从未使用过SWRevealViewController,但你可以试试这个。


  1. 正如您在第一行中所说的 “SWRevealViewController 是 RooVC”,您正在将 SWRevealViewController 转换为 UITabBarController(检查下面的代码行)。这是您的崩溃原因。

    let tabBar:UITabBarController = self.window?.rootViewController as! UITabBarController
    
  2. 现在您需要将UITabBarController 更改为SWRevealViewController

    let rootVC = self.window?.rootViewController as! SWRevealViewController
    
  3. 现在获取所有 ViewControllers

    if let navController = rootVC.navigationController { // for safety check
    
        for controller in navController.viewControllers {
            if controller is ChatVC {
                print("Chat VC is available")
                break
            }
        }
    }
    

为了安全编码并牢记快速可选绑定,您可以执行如下代码,

更新答案

    var haveChatVC = false
    if let rootVC = self.window?.rootViewController as? SWRevealViewController,
        let tabbar = rootVC.frontViewController as? UITabBarController {

        if let requiredNC = tabbar.viewControllers?[1] as? UINavigationController {
            for vc in requiredNC.viewControllers {
                if vc is ChatVC {
                    // ...
                    haveChatVC = true
                    break
                }
            }
        }
        else {
           print("Navigation controller not found.")
        }
    }
    else {
        print("Unable to get root controller or navigation controller")
    }


    if haveChatVC {
        // do task here when chat vc available
    }
    else {
        // do task here when chat vc not available
    }

注意:这只是伪代码。

【讨论】:

  • 兄弟,我已经尝试过你的代码,它没有进入 for 循环。我认为这是因为我们必须首先在 rootVC 之后获取选项卡栏控制器,然后再检查其下的 VC,因为您可以看到我的流程有问题。 @dahiya_boy
  • 尝试打印navController.viewControllers。并让我知道它的输出。
  • 无法获取根控制器或导航控制器。 @dahiya_boy
  • print(self.window?.rootViewController) 的输出是什么??
  • 可选()。它打印这个。 @dahiya_boy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多