UITabBarController以编程方式添加了导致通知打开时出现问题的控制器

问题描述 投票:3回答:2

以下是我的代码以编程方式将控制器添加到UITabBarController

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

var firstTabNavigationController : UINavigationController!
var secondTabNavigationControoller : UINavigationController!
var thirdTabNavigationController : UINavigationController!
var fourthTabNavigationControoller : UINavigationController!
var fifthTabNavigationController : UINavigationController!


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    Fabric.with([Crashlytics.self])

   window = UIWindow(frame: UIScreen.main.bounds)


    window?.backgroundColor = UIColor.black


    let tabBarController = UITabBarController()

    firstTabNavigationController = UINavigationController.init(rootViewController: FirstViewController())
    secondTabNavigationControoller = UINavigationController.init(rootViewController: SecondViewController())
    thirdTabNavigationController = UINavigationController.init(rootViewController: ThirdViewController())
    fourthTabNavigationControoller = UINavigationController.init(rootViewController: FourthViewController())
    fifthTabNavigationController = UINavigationController.init(rootViewController: FifthViewController())

    tabBarController.viewControllers = [firstTabNavigationController, secondTabNavigationControoller, thirdTabNavigationController, fourthTabNavigationControoller, fifthTabNavigationController]


    let item1 = UITabBarItem(title: "Home", image: UIImage(named: "ico-home"), tag: 0)
    let item2 = UITabBarItem(title: "Contest", image:  UIImage(named: "ico-contest"), tag: 1)
    let item3 = UITabBarItem(title: "Post a Picture", image:  UIImage(named: "ico-photo"), tag: 2)
    let item4 = UITabBarItem(title: "Prizes", image:  UIImage(named: "ico-prizes"), tag: 3)
    let item5 = UITabBarItem(title: "Profile", image:  UIImage(named: "ico-profile"), tag: 4)

    firstTabNavigationController.tabBarItem = item1
    secondTabNavigationControoller.tabBarItem = item2
    thirdTabNavigationController.tabBarItem = item3
    fourthTabNavigationControoller.tabBarItem = item4
    fifthTabNavigationController.tabBarItem = item5

    UITabBar.appearance().tintColor = UIColor(red: 0/255.0, green: 146/255.0, blue: 248/255.0, alpha: 1.0)

    self.window?.rootViewController = tabBarController

    window?.makeKeyAndVisible()

    return true
}

现在可以正常工作,但是当我的应用程序关闭并打开通知时,它只会带我进入主页,而不是预期的页面

以下是处理通知的代码

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    // Called to let your app know which action was selected by the user for a given notification.
    let userInfo = response.notification.request.content.userInfo as? NSDictionary
    var userNotification : UserNotification?
    if userInfo is [String : Any] {
        userNotification = createNSaveNotification(userInfo as! [AnyHashable : Any])
    }
    DeeplinkHandler.handleNotification(userNotification: userNotification)
}

类DeeplinkHandler主要方法代码

class func handleNotification(userNotification :  UserNotification?){
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
        if let tabBarController = appDelegate.window?.rootViewController as? UITabBarController,
            let navController = tabBarController.selectedViewController as? UINavigationController {
            handleDeeplinkByType(navController,userNotification)
        }
    }
}

现在观察,我已经添加了[[DispatchQueue.main.asyncAfter(deadline:.now()+ 0.8)]]时间延迟以仅在添加了这么多时间延迟的情况下将通知重定向到用户的通知单击重定向到用户,否则它将不起作用如何处理这种情况并要求应用程序等待第一个标签栏ViewController准备就绪,然后再处理通知

以下是我的代码,以编程方式将控制器添加到UITabBarController类AppDelegate:UIResponder,UIApplicationDelegate {var window:UIWindow? var firstTabNavigationController:...

ios swift apple-push-notifications uitabbarcontroller appdelegate
2个回答
0
投票
您可以复制(tabBarController.viewControllers)添加newViewController并进行设置(tabBarController.viewControllers = newViewControllers]

0
投票
您的ViewController未被添加到tabBarController可能是因为您的代码是在显示'window'属性之前执行的。为了解决此问题,请在窗口初始化下方编写makeKeyAndVisible()函数:
© www.soinside.com 2019 - 2024. All rights reserved.