iOS 9 выбирает индекс панели вкладок с быстрыми действиями, выполняйте ActionForShortcutItem

У меня есть 5 вкладок, и я хочу перейти на определенную вкладку, когда пользователь выбирает определенное Быстрое действие.

Однако я попытался использовать центр уведомлений, ссылаясь на главный viewcontroller и ссылаясь на вкладку в делегате приложения, но ни один из них, похоже, не работает. Метод tabbar.selectedIndex действительно вызывается, но по некоторым причинам вкладка не изменяется при использовании быстрых действий.

 @available(iOS 9.0, *)
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

    let revealVC = self.window!.rootViewController as! SWRevealViewController
    let tabVC = revealVC.childViewControllers[1] as! UITabBarController
    let navVC = tabVC.viewControllers![0] as! UINavigationController
    let shopVC = navVC.viewControllers[0] as! BrowseVC

    switch shortcutItem.type {
    case "com.modesens.search" :

        tabVC.selectedIndex = 0

        //referencing method to go to tab in base view controller also doesn't work...
        //shopVC.goToSelectTab (0)
        completionHandler(true)

       //notification center method gets called but tab actually doesn't change
       //NSNotificationCenter.defaultCenter().postNotificationName("goToTab", object: nil, userInfo: ["tabIndex":0])

    default:
        print("no work")
    }

    completionHandler(false)
}

reveVC является родительским, tabVC является дочерним по отношению ккарточному компьютеру, тогда navVC является дочерним по отношению к табу.

Опять же, я попытался использовать NotificationCenter и сослаться на shopVC, а затем вызвал этот метод:

1 ответ

Решение

Недавно я реализовал быстрые действия на домашнем экране с библиотекой SWRevealVC. Итак, я очень рад рассказать вам, как решить эту проблему.

1) создавать SWRevealVC программно (не в раскадровке)

Если у вас есть 5 вкладок и вы хотите переместить другую вкладку с быстрым действием, вам следует динамически изменить frontVC of SWRevealVC, чтобы реагировать на быстрые действия.

UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window = window; 

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

UINavigationController *frontViewController = [storyboard instantiateViewControllerWithIdentifier:@"mainNaviVC"];

SideMenuViewController *rearViewController = [storyboard instantiateViewControllerWithIdentifier:@"sideMenuVC"];

SWRevealViewController *mainRevealController = [[SWRevealViewController alloc]
                                                                    initWithRearViewController:rearViewController
                                                                    frontViewController:frontViewController];

self.window.rootViewController = mainRevealController;

2) реализовать логику в методе didFinishLaunchingWithOptions

Как уже упоминалось в документации Apple, это лучшее место для логики быстрого действия в didFinishLaunchingWithOptions, если вы хотите изменить первую страницу. В моем случае, executeActionForShortcutItem вызывается только для работы с фоном приложения (вы должны вернуть NO в didFinishLaunchingWithOptions для обработки быстрого действия в didFinishLaunchingWithOptions)

if ([shortcutItem.type isEqualToString:shortcutAroundStop]) {
        handled = YES;

        UINavigationController *frontViewController = [storyboard instantiateViewControllerWithIdentifier:@"naviStopAroundVC"];
        SideMenuViewController *rearViewController = [storyboard instantiateViewControllerWithIdentifier:@"sideMenuVC"];

        SWRevealViewController *mainRevealController = [[SWRevealViewController alloc]
                                                        initWithRearViewController:rearViewController
                                                        frontViewController:frontViewController];


        self.window.rootViewController = mainRevealController;
        [self.window makeKeyAndVisible];
    }

И я даю пример проекта, который я делаю (цель-c) для вас. Я надеюсь, что это решит вашу проблему.

https://github.com/dakeshi/3D_Touch_HomeQuickAction

Другие вопросы по тегам