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) для вас. Я надеюсь, что это решит вашу проблему.