iOS 9 使用快速操作选择标签栏索引,performActionForShortcutItem
iOS 9 selecting tabbar index with quick actions, performActionForShortcutItem
我有 5 个选项卡,我想在用户 select 某个快速操作时转到特定选项卡。
但是,我尝试使用通知中心,引用主 viewcontroller 并引用应用程序委托中的选项卡,但 none 似乎有效。 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)
}
revealVC 是父级,tabVC 是 revealVC 的子级,navVC 是 tab 的子级。
同样,我尝试使用 notificationCenter 并引用 shopVC,然后调用此方法:
最近,我用SWRevealVC库实现了主屏快捷操作。所以,我很高兴告诉你如何解决这个问题。
1) 以编程方式创建 SWRevealVC(不在故事板中)
如果您有 5 个标签,并且您想快速移动另一个标签,
您应该动态更改 SWRevealVC 的 frontVC 以响应快速操作。
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 中快速操作逻辑的最佳位置。
在我的例子中,只调用 performActionForShortcutItem 来处理应用程序的背景。(你应该 return 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];
}
我给你一个我做的示例项目(objective-c)。希望能解决你的问题。
我有 5 个选项卡,我想在用户 select 某个快速操作时转到特定选项卡。
但是,我尝试使用通知中心,引用主 viewcontroller 并引用应用程序委托中的选项卡,但 none 似乎有效。 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)
}
revealVC 是父级,tabVC 是 revealVC 的子级,navVC 是 tab 的子级。
同样,我尝试使用 notificationCenter 并引用 shopVC,然后调用此方法:
最近,我用SWRevealVC库实现了主屏快捷操作。所以,我很高兴告诉你如何解决这个问题。
1) 以编程方式创建 SWRevealVC(不在故事板中)
如果您有 5 个标签,并且您想快速移动另一个标签, 您应该动态更改 SWRevealVC 的 frontVC 以响应快速操作。
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 中快速操作逻辑的最佳位置。 在我的例子中,只调用 performActionForShortcutItem 来处理应用程序的背景。(你应该 return 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];
}
我给你一个我做的示例项目(objective-c)。希望能解决你的问题。