2016-04-30 3 views
0

У меня возникла проблема с 3D Touch. Он отлично работает, за исключением случаев, когда приложение запускается впервые. Вот следующий код в моем AppDelegate:3D Touch быстрые действия не работают при первом запуске приложения

func handleQuickAction(shortcutItem: UIApplicationShortcutItem) -> Bool { 
    var quickActionHandled = false 
    let type = shortcutItem.type.componentsSeparatedByString(".").last! 
    if let shortcutType = Shortcut(rawValue: type) { 
     switch shortcutType { 
     case .aboutMe: 
      NSNotificationCenter.defaultCenter().addObserver(RAIntroductionViewController(), selector: #selector(RAIntroductionViewController.aboutMeTap), name: "about", object: nil) 
      NSNotificationCenter.defaultCenter().postNotificationName("about", object: self) 
      quickActionHandled = true 
     case .education: 
      NSNotificationCenter.defaultCenter().addObserver(RAIntroductionViewController(), selector: #selector(RAIntroductionViewController.educationTap), name: "education", object: nil) 
      NSNotificationCenter.defaultCenter().postNotificationName("education", object: self) 
      quickActionHandled = true 
     case .projects: 
      NSNotificationCenter.defaultCenter().addObserver(RAIntroductionViewController(), selector: #selector(RAIntroductionViewController.projectsTap), name: "projects", object: nil) 
      NSNotificationCenter.defaultCenter().postNotificationName("projects", object: self) 
      quickActionHandled = true 
     case .why: 
      NSNotificationCenter.defaultCenter().addObserver(RAIntroductionViewController(), selector: #selector(RAIntroductionViewController.whyPressed(_:)), name: "why", object: nil) 
      NSNotificationCenter.defaultCenter().postNotificationName("why", object: self) 
      quickActionHandled = true 
     } 
    } 
    return quickActionHandled 
} 

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { 
    completionHandler(handleQuickAction(shortcutItem)) 

} 

Вот код в viewDidLoad способе RAIntroductionViewController:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.aboutMeTap), name: "about", object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.educationTap), name: "education", object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.projectsTap), name: "projects", object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.whyPressed(_:)), name: "why", object: nil) 

Эти наблюдатели называют методы, которые толкают навигационный контроллер.

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

ответ

3

Когда приложение впервые запущено, application:performActionForShortcutItem shortcutItem:completionHandler: не вызывается.

Вместо этого вы должны обращаться с этим в application:didFinishLaunchingWithOptions:.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {   
    if let options = launchOptions, 
     let shortcutItem = options[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { 
     // do the work here.. 
    } 
    return true 
} 

Надеется, что это помогает :)

+0

Спасибо за ответ. Я пробовал это, но я получаю сообщение об ошибке: неожиданно нашел нуль, разворачивая необязательное значение. Я предполагаю, что переменная 'shortcutItem' равна нулю. Есть идеи? –

+0

Приятно слышать отзывы от вас, код работает только тогда, когда 'launchOptions' не' nil', и есть значение для 'UIApplicationLaunchOptionsShortcutItemKey'. Я обновил код, поэтому тело оператора 'if' будет выполняться только в том случае, если приложение запускается из ярлыка 3D Touch. Не могли бы вы попробовать новый код и посмотреть, работает ли он? Благодаря! –

+0

Благодарим за обновление. Я пробовал этот код, и ничего не происходило. Не было ошибок или сбоев, но он не попал на правильную страницу. Чтобы уточнить, я использую NSNotificationCenter, чтобы добавить наблюдателя для этого. –

Смежные вопросы