2015-09-28 6 views
8

Vorrei aggiungere le azioni rapide di iOS 9 alla mia app.Aggiungere "azioni rapide" alla mia app iOS 9

ho messo questo codice nel mio app delegato:

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 
    } 
} 

Ora posso fare un tocco vigore mia icona app> azioni rapide si visualizzeranno> seleziono il Quick Action "Nuova scansione"> l'applicazione si aprirà e mi mostrerà l'ultima visione, che ho lasciato.

Ma il seguito non verrà eseguito.

Ecco una parte del mio storyboard:

enter image description here

Spiegazione:

A: Navigation Controller e controller Initiale

B: ViewController, dopo un controllo questo renderà un segue alla navigazione Controller C

C: Controller di navigazione

D: Table View Controller

E: ViewController

Se seleziono Nuova scansione con azioni rapide - vorrei mostrare ViewController E.

risposta

5

Sembra che si sta facendo le cose in base correttamente su example code in the documentation. Tuttavia, hai un sacco di concatenazioni opzionali nell'implementazione handleShortCutItem:. Hai usato il debugger per verificare che nessuna di quelle espressioni abbia valori nulli? Inoltre, da quello che riesco a vedere (anche se l'immagine è sfocata), il controller della vista radice del primo controller nav in quello storyboard non ha un seguito per E. Quindi non sono sicuro di come intendi arrivarci.

Si consiglia di impostare un punto di interruzione nell'implementazione handleShortCutItem: per verificare che i valori con cui si sta lavorando non siano nil e che il codice sia effettivamente in esecuzione. Dopo averlo fatto, puoi utilizzare lo storyboard per istanziare i controlli di visualizzazione che desideri e solo crearne uno come desideri che la gerarchia del controller di visualizzazione sia nel tuo controller di navigazione e impostare la proprietà viewControllers del controller di navigazione su questo array. Anche in questo caso, è difficile dire esattamente quello che vuoi dalla tua immagine, ma forse qualcosa di simile:

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 
} 

Nota: Dal momento che hai contrassegnato questa domanda con Swift2, mi sono preso la libertà di adattare il codice per utilizzare guardia dichiarazioni.