0

Мне сложно понять, как быстро работать с моими быстрыми действиями.Правильный способ быстрого запуска приложений с помощью быстрых действий

Мои быстрые действия работают, однако, если приложение было в фоновом режиме и перезапущено с быстрым действием.

Когда я пытаюсь запустить приложение прямо из быстрого действия, приложение открывается, как если бы оно было запущено, просто нажав значок приложения (т. Е. Он ничего не делает).

Вот код от моего делегата приложения.

В 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) должен переключитесь на определенную страницу относительно выбранной комбинации клавиш.

Любые идеи о том, что вызывает ярлык, чтобы ничего не делать при использовании его для запуска в отличие от повторного открытия приложения с фона?

+0

Я снова столкнулся с этой проблемой и снова получил такую ​​же проблему, я думаю, это связано с тем, что при запуске приложения с быстрым действием контроллер корневого представления еще не создан и поэтому вы не можете вызвать методы в теме. У меня нет решения, хотя, к сожалению. – SimonBarker

+0

Я нашел решение для своей программы! Надеюсь, это применимо к другим, кто ищет способ сделать это. – iOShepherd

ответ

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]; 
    }); 

Выше работали как магия, а ярлыки ведут к правильной странице. Используя подобный подход к моему, мы надеемся, даст желаемые результаты для всех, кто хотел бы получить свои ярлыки, работая, запустив приложение.