【问题标题】:push root viewcontroller from appdelegate从 appdelegate 推送根视图控制器
【发布时间】:2017-10-23 20:56:33
【问题描述】:

我的应用程序 rootviewcontroller 带有标签栏,但是当我使用 firebase 推送通知时,它只允许我“呈现”方法。当我查看此视图​​控制器时,我想通过推送(如子项)查看控制器以具有选项卡栏和后退选项。

在我的代码中,我想从 present 转移到 PUSH,但我找不到解决方案。 currentController.present(控制器,动画:true,完成:nil)

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {

    if Defaults.hasKey(.logged), let logged = Defaults[.logged], logged == true {

        //TODO


            if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ProductDetailsViewController") as? ProductDetailsViewController {
                controller.productFromNotificationByCode(code: userInfo["product_code"] as! String, productID: userInfo["product_id"] as! String)
                if let window = self.window, let rootViewController = window.rootViewController {
                    var currentController = rootViewController
                    while let presentedController = currentController.presentedViewController {
                        currentController = presentedController
                    }
                    currentController.present(controller, animated: true, completion: nil)
                }
            }
        }
        print(userInfo)
    }
    completionHandler()
}

【问题讨论】:

  • 您需要先从情节提要加载标签栏控制器,依此类推

标签: ios swift controller viewcontroller


【解决方案1】:

我还没有测试,但我相信它只是工作。试试这个:

func pushViewController() {

    let storyboard = UIStoryboard.init(name: "YourStoryboardName", bundle: nil)
    let tabBarController = storyboard.instantiateViewController(withIdentifier: "YourTabBarController") as! UITabBarController

    let navigationController = storyboard.instantiateViewController(withIdentifier: "YourNavigationController") as! UINavigationController

    let productDetailsViewController = storyboard.instantiateViewController(withIdentifier: "ProductDetailsViewController") as! ProductDetailsViewController

    tabBarController.viewControllers = [navigationController]
    if tabBarController.selectedViewController == navigationController {
        navigationController.pushViewController(productDetailsViewController, animated: true)
    }



    self.window = UIWindow.init(frame: UIScreen.main.bounds)
    self.window?.rootViewController = tabBarController
    self.window?.makeKeyAndVisible()

}

【讨论】:

    【解决方案2】:

    最简单的方法是将根视图控制器包装在故事板中的 UINavigationController 中。这将使实际的根控制器成为 UINavigationController 而不是 UITabBarController。

    一旦完成,您就可以简单地做

    if let window = self.window, let rootNavController = window.rootViewController as? UINavigationController {
       navigationController?.pushViewController(controller, animated: true)
    }
    

    或者,如果您真正想要的是“从右侧滑动”动画并且不需要完整的导航堆栈,您可以编写一个自定义视图控制器转换,使用模态控制器提供类似的效果。

    【讨论】:

    • 我尝试可能是在错误的地方,你能编辑我的代码并粘贴到这里吗?
    • @Johnie 我上面放的代码可以替换你现有的内部如果让,但首先你需要改变你的故事板将 TabBarController 放在 NavController 中
    • 我试过你的代码,但它不会显示视图控制器,它会停留在那里加载数据
    • @Johnie 如果没有看到你所有的代码,很难说出了什么问题,但我猜你的故事板有问题
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-05-04
    相关资源
    最近更新 更多