2015-09-28 13 views
8

Chciałbym dodać szybkie akcje iOS 9 do mojej aplikacji.Dodaj "szybkie akcje" do mojej aplikacji iOS 9

mogę umieścić ten kod w moim app delegata:

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

Teraz mogę zrobić odrobinę siły na moim app ikonę> Szybkie działania zostaną pokazane> I wybrać Szybka akcja „New Scan”> aplikacja otworzy się i pokaże mi ostatni widok, który opuściłem.

Ale segue nie zostanie wykonany.

Tutaj jest częścią mojego ujęć:

enter image description here

Objaśnienie:

A: Kontroler nawigacyjny i Initiale Controller

B: ViewController, po sprawdzeniu tego dokona segue do nawigacji Kontroler C

C: Kontroler nawigacyjny

D: Table View Controller

E: ViewController

Jeśli wybiorę Nowe skanowanie z szybkich działań - Chciałbym pokazać ViewController E.

Odpowiedz

5

Wydaje się, że robisz rzeczy prawidłowo w oparciu na example code in the documentation. Masz jednak wiele opcjonalnych łańcuchów w implementacji handleShortCutItem:. Czy użyłeś debuggera do sprawdzenia, czy żadne z tych wyrażeń nie ma wartości zerowych? Ponadto, z tego, co widzę (mimo że obraz jest rozmazany), kontroler widoku głównego pierwszego kontrolera nawigacyjnego w tym scenorysie nie ma przejścia na E. Nie jestem więc pewien, jak zamierzacie się tam dostać.

Proponuję ustawić punkt przerwania w swojej implementacji handleShortCutItem:, aby najpierw sprawdzić, czy wartości, z którymi pracujesz, nie są nil i kod jest faktycznie wykonywany. Gdy to zrobisz, możesz użyć swojego scenorysu do utworzenia żądanych formantów widoku i po prostu utwórz ich tablicę, tak jak chcesz, aby hierarchia kontrolera widoku znajdowała się w kontrolerze nawigacyjnym i ustaw właściwość kontrolera nawigacyjnego na tę tablicę jako viewControllers. Ponownie, to trudno powiedzieć dokładnie, co chcesz ze swojego wizerunku, ale być może coś takiego:

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 
} 

Uwaga: Ponieważ określili to pytanie Swift2, wziąłem wolność dostosowanie kodu do korzystania straży sprawozdania.