iOS Swift:当应用程序从推送通知启动时,推送两个视图控制器

时间:2018-06-13 17:27:34

标签: ios swift xcode swift4

当用户从推送通知启动应用程序时,我会显示一个视图控制器,然后推送另一个视图控制器。我提供第一个VC的代码如下

let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeNav: UIViewController = mainStoryBoard.instantiateViewController(withIdentifier: "HomeNavController") as! UINavigationController
            let homePageTableVC = mainStoryBoard.instantiateViewController(withIdentifier: String(describing: HomePageTableViewController.self)) as! HomePageTableViewController
            homePageTableVC.tipToPresent = tipDay
            homeNav.addChildViewController(homePageTableVC)
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.rootViewController = homeNav
            self.window?.makeKeyAndVisible()

homeTableVC(在viewDidLoad方法中)使用tipToPresent属性,然后使用以下代码显示第二个VC:

if let tipDayToPresent = tipToPresent {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tipVC = storyboard.instantiateViewController(withIdentifier: String(describing: TipViewController.self)) as! TipViewController
        tipVC.dayOfTip = tipDayToPresent
        tipToPresent = nil
        navigationController?.pushViewController(tipVC, animated: true)
    }

这很有效,但当我按后退按钮返回homePageTableVC时,导航栏为空白。通常显示的标题图像,菜单按钮和右侧栏按钮不可见。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我认为问题在于如何在导航控制器上添加表格。而不是将其作为导航的根视图控制器,而是将其添加为子vc。

更改像这样的代码应该有效:

let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// Remove type UIViewController                
let homeNav = mainStoryBoard.instantiateViewController(withIdentifier: "HomeNavController") as! UINavigationController

let homePageTableVC = mainStoryBoard.instantiateViewController(withIdentifier: String(describing: HomePageTableViewController.self)) as! HomePageTableViewController
                homePageTableVC.tipToPresent = tipDay

// Set controllers instead of adding child
homeNav.setViewControllers([homePageTableVC], animated: false)
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = homeNav
self.window?.makeKeyAndVisible()

答案 1 :(得分:1)

您可以尝试更改此

homeNav.addChildViewController(homePageTableVC)

到这个

homeNav.setViewControllers([homePageTableVC], animated: false)

答案 2 :(得分:1)

如果@augie的解决方案有效,那就太好了。我建议您在处理推送通知深层链接时不应更改导航堆栈。它应该与普通应用程序启动时的行为相同。通过这种方式,您不需要处理任何边缘情况,也不需要设置不同的窗口。

解决方案:每当有人点击推送通知时,都会关闭所有呈现的控制器和popToRootViewController,然后导航到所需的屏幕。