You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AppDelegate的didReceiveRemoteNotification中模态跳转后Push控制器

解决远程通知中从HomeController Push详情页的问题

我明白你的困扰——本来想在present导航控制器之后push详情页,结果变成了模态弹出,这肯定不是你想要的效果。问题核心在于你没有正确使用当前present出来的导航控制器实例来执行push操作,而是误用了新实例或者错误的控制器。

下面是具体的解决步骤和代码示例:

关键思路

你已经能成功present包含HomeController的UINavigationController,那在present的completion回调里,直接用这个已经present出来的导航控制器来push详情页就可以了,不需要重新创建HomeController的新实例,也不需要用其他控制器来present详情页。

完整代码示例

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // 第一步:解析通知中的产品数据(根据你的实际字段调整)
    guard let productId = userInfo["product_id"] as? String else {
        completionHandler(.failed)
        return
    }
    
    // 第二步:获取当前的根控制器LoginController
    guard let loginVC = window?.rootViewController as? LoginController else {
        completionHandler(.failed)
        return
    }
    
    // 第三步:创建目标导航控制器(根为HomeController)
    let homeVC = HomeController()
    let targetNav = UINavigationController(rootViewController: homeVC)
    
    // 第四步:present导航控制器,并在完成回调中push详情页
    loginVC.present(targetNav, animated: true) {
        // 直接使用刚刚present的targetNav来push,这才是正确的导航栈操作
        let detailVC = ProductDetailController(productId: productId)
        targetNav.pushViewController(detailVC, animated: true)
    }
    
    completionHandler(.newData)
}

为什么之前的尝试失败?

  • 如果你创建了HomeController的新实例并尝试push,这个新实例并没有加入到当前present的导航栈中,后续如果误用present方法就会变成模态弹出。
  • 如果你没有拿到正确的导航控制器实例(比如去获取其他导航控制器),也会导致操作的不是目标导航栈,出现不符合预期的页面跳转。

额外提示

如果后续你的App有用户已登录的场景(此时window的root可能已经是HomeController所在的导航控制器),可以额外判断当前root控制器的类型,直接从现有导航栈push详情页,避免重复present导航控制器。

内容的提问来源于stack exchange,提问作者Gustavo Bergamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:23:51