0

当我通过快速操作启动我的应用程序时,我很难弄清楚如何让我的快速操作发挥作用。

但是,如果应用程序在后台并通过快速操作重新启动,我的快速操作将起作用。

当我尝试直接从快速操作启动应用程序时,应用程序会打开,就好像它是通过简单地点击应用程序图标启动的一样(即它什么也不做)。

这是我的 App Delegate 的一些代码。

didFinishLaunchingWithOptions 中:

UIApplicationShortcutItem *shortcut = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
if(shortcut != nil){
    performShortcutDelegate = NO;
    [self performQuickAction: shortcut fromLaunch:YES];
}

该方法称为:

-(BOOL) performQuickAction: (UIApplicationShortcutItem *)shortcutItem fromLaunch:(BOOL)launchedFromInactive {
NSMutableArray *meetings = [self.fetchedResultController.fetchedObjects mutableCopy];
[meetings removeObjectAtIndex:0];
unsigned long count = meetings.count;
BOOL quickActionHandled = NO;
if(count > 0){
    MainViewController *mainVC = (MainViewController *)self.window.rootViewController;
    if(launchedFromInactive){
        mainVC.shortcut = shortcutItem;
    }
    else{
        UINavigationController *childNav;
        MeetingViewController *meetingVC;
        for(int i = 0; i < mainVC.childViewControllers.count; i++){
            if([mainVC.childViewControllers[i] isKindOfClass: [UINavigationController class]]){
                childNav = mainVC.childViewControllers[i];
                meetingVC = childNav.childViewControllers[0];
                break;
            }
        }

        self.shortcutDelegate = meetingVC;

        if ([shortcutItem.type isEqual: @"Meeting"]){
            NSNumber *index = [shortcutItem.userInfo objectForKey:@"Index"];
            [self.shortcutDelegate switchToCorrectPageWithIndex: index launchedFromInactive:NO];
            quickActionHandled = YES;
        }
    }
}

唯一需要执行的操作是我的页面视图控制器(嵌入在 meetingVC 中)应根据所选快捷方式切换到某个页面。

关于是什么导致快捷方式在使用它启动而不是从后台重新打开应用程序时不做任何事情的任何想法?

4

1 回答 1

0

我开始意识到我试图在一个尚未在内存中的视图控制器上调用我的方法。这在我的应用程序中引起了奇怪的行为。我确实有正确的方法来访问视图控制器,然后我意识到尝试使用 GCD 执行代码的可能性。

__block MeetingViewController *safeSelf = self;
contentVC = [self initializeContentViewController: self.didLaunchFromInactive withPageIndex: intIndex];
NSArray *viewControllers = @[contentVC];
dispatch_async(dispatch_get_main_queue(), ^{
        [safeSelf.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    });

上面的工作就像魔术一样,快捷方式指向正确的页面。使用类似的方法进行挖掘有望为其他任何希望通过启动应用程序来使其快捷方式工作的人产生所需的结果。

于 2016-09-18T22:57:48.757 回答