单击推送通知时,正确重定向到选项卡栏导航控制器内的视图控制器

2023-12-30

我有一个tabBar。它的每个选项卡ViewControllers已嵌入到各自的NavigationControllers.

等级制度:

Tabbarcontroller --> NavigationController--> VC1 --> VC2 -->...VCn(对于选项卡 1)

当我点击推送通知时,我必须重定向到其中一个视图控制器(VC2)。我正在使用的代码如下。

let navigationController = UINavigationController()
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
if let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as? ChatViewController {
    navigationController.viewControllers = [chatViewController]
    window?.rootViewController = navigationController
}

通过使用这个,我被重定向到相应的ViewController。但是,我无法回到tabBar。那么是否可以通过允许我返回选项卡栏的方式进行重定向,从而提供与 UI 中相同的层次结构?

EDIT:

下图显示了我的布局。

我想完成以下任务:

  1. 当用户点击推送通知时,应用程序应定向到 VC-B。 *如果 VC-B 已经位于导航堆栈顶部,则不应为 VC-B 创建新对象并将其添加到导航堆栈。

  2. 如果应用程序已终止并且用户点击通知,则应打开 VC-B。

为了确定应用程序是否已终止,我将标志设置为:

func applicationWillTerminate(_ application: UIApplication) {
    UserDefaults.standard.set(true, forKey: UserDefaultsKey.isTerminated)
}

该标志在 didFinishLaunchingWithOptions 函数结束时设置为 false。

对于重定向,我检查此标志以确定应用程序是否已终止:

func performRedirectionToSuitableViewController(userInfo: [AnyHashable: Any]) {
  
    let isTerminated = UserDefaults.standard.object(forKey: UserDefaultsKey.isTerminated) as! Bool
    
    if isTerminated {
        
        let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
        
        let tab = storyboard.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
        
        tab.selectedIndex = 0
        
        let nav = tab.viewControllers![0] as! UINavigationController
        
        let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as! ChatViewController
        
        chatViewController.chatThreadId = userInfo["thread_id"] as? String
        
        nav.pushViewController(chatViewController, animated: true)

    } else {

        if let tab = window?.rootViewController?.presentedViewController as? UITabBarController {

            let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)

            let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as! ChatViewController
                
            chatViewController.chatThreadId = userInfo["thread_id"] as? String
               
            if let nav = tab.selectedViewController as? UINavigationController {
                   
                nav.pushViewController(chatViewController, animated: true)
            }     
        }
    }
}

有了这段代码,我的第一个要求就部分满足了。需要确定视图控制器是否位于导航堆栈的顶部。

并且,在终止应用程序的情况下,单击推送通知将打开选项卡栏,并选择默认选择索引。

我花了几天时间试图解决这个问题。但无法让它发挥作用。


我想你必须做这样的事情:

let tabBar: UITabBarController // get your tab bar
tabBar.selectedIndex = 0 // eg. zero. To be sure that you are on correct tab
if let navigation = tabBar.viewControllers?[tabBar.selectedIndex] as? UINavigationController {
    let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
    if let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as? ChatViewController {
        navigation.pushViewController(chatViewController, animated: true)
    }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单击推送通知时,正确重定向到选项卡栏导航控制器内的视图控制器 的相关文章

  • iOS 无法获取人物图像

    我有两个 tableViewController 第一个有联系人列表 另一张显示详细的人员信息 第一个tableViewController的一段代码 ABAddressBookRef addressBook ABAddressBookCr
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • 从 ios 应用程序到 symfony2 Web 应用程序的登录和管理会话

    我使用 Symfony2 开发了一个 Web 应用程序 我用过FOS用户包用于用户管理和安全 现在 我正在考虑为我的网络开发一个本机 iOS 应用程序 但并不真正知道如何解决从应用程序创建会话的问题 并在整个交互用户应用程序中维护它 换句话
  • UICollectionView 设置列数

    我刚刚开始学习 UICollectionViews 我想知道是否有人知道如何指定集合视图中的列数 默认设置为 3 iPhone 肖像 我查看了文档 似乎找不到简洁的答案 对于 Swift 5 和 iOS 12 3 您可以使用4 以下实现为了
  • 如何从 Xcode 4.5 卸载 iOS 5.0 模拟器

    我已经安装了 Xcode 4 5 由于我编写应用程序是为了好玩 我不打算支持旧版 iOS 版本 并且为了节省 500 GB iMac 上的空间 是否有办法删除它 尝试从 Xcode 包中支持的平台中删除 iPhone iPhoneSimul
  • iOS FacebookSDK + 解析 SDK + GoogleMaps SDK

    我搜索了很多 然后我意识到 ObjC标记那个GoogleMapSDK需要 但不能很好地配合ParseSDK and FacebookSDK 所以我阅读了所有的 stackoverflow 答案并尝试解决我的问题 问题还没有解决 我执行的步骤
  • 更改目录时 Gitlab CI 运行程序作业失败退出状态 1

    我正在使用我的个人机器作为使用 Fastlane 的 iOS 项目的运行程序 这主要是因为共享运行器没有为 iOS 设置 因为它们没有安装 Xcode 更改目录时我的作业立即失败 它是一个 shell 运行程序 根本没有其他自定义配置 有什
  • Swift 语言中的 #ifdef 替换

    在 C C Objective C 中 您可以使用编译器预处理器定义宏 此外 您可以使用编译器预处理器包含 排除代码的某些部分 ifdef DEBUG Debug only code endif Swift 中有类似的解决方案吗 是的 你可
  • Swift Siesta 访问响应原始数据

    我的 API 中有一个返回 PDF 文件内容的方法 如何在成功回调中获取响应的原始数据 所有午睡响应均以原始数据开始 以基础类型的形式Data 然后运行变压器管道 http bustoutsolutions github io siesta
  • 在 macOS 上使用 Swift 3 从剪贴板读取

    我是 Swift 的初学者 我想弄清楚如何在 macOS Swift 3 上读取已复制到剪贴板的内容 我搜索了很多 但似乎找不到任何有效的东西 我从网上尝试过的一些事情 var pasteboardItems NSPasteboardIte
  • gestureRecognizer shouldReceiveTouch 持续存在于已释放的视图中导致崩溃

    我有一个相当简单的 UITableView 它在堆栈上推送一个新视图 新视图有一个像这样初始化的gestureRecognizer synthesize swipeGestureLeft void viewDidLoad swipeGest
  • Grand Central Dispatch (GCD) 调度源标志

    我最近不再使用 to GCD 调度来源 https developer apple com documentation dispatch 1385630 dispatch source create监视文件更改 效果很好 API 也变得更加
  • iOS绘图3D图形库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个可以帮助我绘制 3D 图表的库 我想要类似的东西这一页 http www math uri edu bkaskosz fla
  • iOS 有 INTERNET 权限吗?

    我在 iOS 设备上的 flutter dio 包上遇到了一个奇怪的问题 我编写了一个向 url 发送 GET 请求的应用程序 Android 上一切正常 但 iOS 上的请求似乎无法通过 没有发生任何错误 什么也没有 我在 Android
  • 增加 iPhone 的推送通知徽章

    是否可以在收到通知时增加徽章值 或者我应该将计数作为有效负载发送吗 如果我每次都将徽章值发送为 1 那么如果应用程序未打开 我如何增加应用程序图标中的徽章值 我已经使用了这段代码 但不起作用 void application UIAppli
  • 如何在 SwiftUI 中延迟动画?

    我想为两个文本字段设置动画 第二个字段有延迟 但它不起作用 没有延迟 它们同时从位置 100 动画到 0 这是代码 State private var offset CGFloat 100 State private var offset2
  • 获取所有ios应用程序的全局列表[重复]

    这个问题在这里已经有答案了 我想对苹果应用商店进行一些全球统计 一个瓶颈是至少获取所有当前活动应用程序的 ID 这 9 位数字 有谁知道如何获取 iOS 应用商店中当前活动应用程序的所有 id 的完整列表 更好的是特定类别的所有 ID 例如
  • 隐藏 UITableview 单元格

    我正在尝试从 UITableView 中隐藏单元格 就像删除操作一样 但我只想隐藏它以便稍后在相同位置显示它 我知道 UITableViewCell 有一个名为 隐藏 的属性 但是当我使用此属性隐藏单元格时 它会隐藏但没有动画 并且会留下空
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • iOS 中是否需要 Google App Indexing SDK 才能使用 Google DeepLinking?

    我想用谷歌应用程序索引与我的网页和 iOS 应用程序 我支持通用链接 or 深层链接用谷歌术语 与苹果Search并相应地设置我的网页 From 谷歌文档 https developers google com app indexing i

随机推荐