2015-09-28 2 views
8

Я хотел бы добавить быстрые действия iOS 9 в свое приложение.Добавьте «быстрые действия» к моему приложению iOS 9

Я ставлю этот код в моем приложении делегат:

import UIKit 
enum ShortcutType: String { 
    case NewScan = "QuickAction.NewScan" 
    case Settings = "QuickAction.Settings" 
} 
@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    static let applicationShortcutUserInfoIconKey = "applicationShortcutUserInfoIconKey" 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

     UIViewController.prepareInterstitialAds() 

     if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))) { 
      UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)) 
     } 

     // QUICK ACTIONS 
      var launchedFromShortCut = false 

      if #available(iOS 9.0, *) { 
       if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { 
        launchedFromShortCut = true 
        handleShortCutItem(shortcutItem) 
       } 
      } else { 
       return true 
      } 
      return !launchedFromShortCut 

    } 

    /**************** QUICK ACTIONS ****************/ 
    @available(iOS 9.0, *) 
    func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: Bool -> Void) { 
      let handledShortCutItem = handleShortCutItem(shortcutItem) 
      completionHandler(handledShortCutItem) 
    } 
    @available(iOS 9.0, *) 
    func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool { 
     var handled = false 
     if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) { 
      let rootNavigationViewController = window!.rootViewController as? UINavigationController 
      let rootViewController = rootNavigationViewController?.viewControllers.first as UIViewController? 
      rootNavigationViewController?.popToRootViewControllerAnimated(false) 
      switch shortcutType { 
       case .NewScan: 

        rootViewController?.performSegueWithIdentifier("goToCamera", sender: nil) 
        handled = true 

       case.Settings: 
        rootViewController?.performSegueWithIdentifier("goToSettings", sender: nil) 
        handled = true 
      } 
     } 
     return handled 
    } 
} 

Теперь я могу сделать прикосновение силы на мой значок приложения> быстрые действия будут показаны> Я выбираю Quick Action «New Scan»> приложение откроется и покажет мне последнее представление, которое у меня осталось.

Но segue не будет выполнен.

Вот часть моей раскадровки:

enter image description here

Объяснение:

A: Навигационный контроллер и Initiale контроллер

B: ViewController после проверки это сделает SEGUE навигация Контроллер C

C: Контроллер навигации

D: Table View Controller

E: ViewController

Если я выбираю новое сканирование с быстрыми действиями - Я хотел бы показать ViewController Е.

ответ

5

Похоже, что вы делаете вещи правильно на основе на example code in the documentation. Тем не менее, у вас есть много дополнительных цепочек в вашей реализации handleShortCutItem:. Использовали ли вы отладчик, чтобы убедиться, что ни одно из этих выражений не имеет значений nil? Кроме того, из того, что я вижу (хотя изображение размыто), контроллер корневого представления первого навигационного контроллера в этой раскадровке не имеет сегмента для E. Поэтому я не уверен, как вы собираетесь туда попасть.

Я бы предположил, что вы установили точку останова в своей реализации handleShortCutItem:, чтобы сначала проверить, что значения, с которыми вы работаете, не являются nil и код фактически выполняется. Как только вы это сделаете, вы можете использовать свою раскадровку для создания элементов управления представлением, которые вы хотите, и просто создать массив из них, как вы хотите, чтобы ваша иерархия контроллера просмотра находилась в вашем навигационном контроллере и задала свойство viewControllers навигационного контроллера для этого массива. Опять же, это трудно сказать, что именно вы хотите от вашего образа, но, возможно, что-то вроде этого:

func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool { 
    guard let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) else { 
     return false 
    } 

    guard let rootNavigationController = window?.rootViewController as? UINavigationController else { 
     return false 
    } 

    guard let rootViewController = rootNavigationController?.viewControllers.first else { 
     return false 
    } 

    guard let storyboard = rootNavigationController.storyboard else { 
     return false 
    } 

    var viewControllers = [rootViewController] 
    switch shortcutType { 
    case .NewScan: 
     // Instantiate the necessary view controllers for this case 
     viewControllers += [storyboard.instantiateViewControllerWithIdentifier("<#Identifier for some view controller#>")] 
     ... 
     viewControllers += [storyboard.instantiateViewControllerWithIdentifier("<#Identifier for some other view controller#>")] 

    case.Settings: 
     // Instantiate the necessary view controllers for this case 
     viewControllers += [storyboard.instantiateViewControllerWithIdentifier("<#Identifier for some view controller#>")] 
     ... 
     viewControllers += [storyboard.instantiateViewControllerWithIdentifier("<#Identifier for some other view controller#>")] 
    } 

    // Set the new view controllers array 
    rootNavigationController.setViewControllers(viewControllers, animated: false) 

    return true 
} 

Примечания: Так как вы помечено этот вопрос с Swift2, я взял на себя смелость корректировки коды для использования караула заявления.

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