2015-09-28 6 views
10

Ich bin mit Shortcuts auf dem Home-Bildschirm mit 3D Touch, und es funktioniert gut, aber die Art, wie ich es derzeit habe, bedeutet, wenn die Verknüpfung den Benutzer zu einem bestimmten View-Controller nimmt Bar und Navigationsleiste fehlt.Navigation und Tab-Leiste fehlt beim Anzeigen von View-Controller

Dies ist mein Code:

func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool { 
    var handled = false 

    if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) { 
     let rootViewController = window!.rootViewController 

     switch shortcutType { 
     case .Favourites: 
      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let rootController = storyboard.instantiateViewControllerWithIdentifier("favourites") as! FavouritesTableViewController 
      rootController.parkPassed = DataManager.sharedInstance.getParkByName(NSUserDefaults.standardUserDefaults().stringForKey("currentPark")!) 
      self.window?.rootViewController = rootController 
      self.window?.makeKeyAndVisible() 

      handled = true 
     } 
    return handled 
} 

Kann jemand empfehlen, was ich in den Code ändern müssen?

Dies ist die Steuerbord-Layout (FavouritesTableViewController angegeben):

enter image description here

EDIT:

Hier ist meine aktualisierte Code:

@available(iOS 9.0, *) 
func handleShortCutItem(shortcutItem: UIApplicationShortcutItem) -> Bool { 
    var handled = false 

    if let shortcutType = ShortcutType.init(rawValue: shortcutItem.type) { 
     switch shortcutType { 
     case .Favourites: 
      print("favourites") 
      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let rootController = storyboard.instantiateViewControllerWithIdentifier("favourites") as! FavouritesViewController 
      rootController.parkPassed = DataManager.sharedInstance.getParkByName(NSUserDefaults.standardUserDefaults().stringForKey("currentPark")!) 

      let root = UIApplication.sharedApplication().delegate as! AppDelegate 
      if let navCont = root.window?.rootViewController?.navigationController { 
       navCont.presentViewController(rootController, animated: true, completion: nil) 
      } else { 
       root.window?.rootViewController?.presentViewController(rootController, animated: true, completion: nil) 
      } 

      root.window?.makeKeyAndVisible() 

      handled = true 
     } 
    } 
    return handled 
} 
+1

wenn sie fehlen, dann werden Sie es aus dem Fenster Stammansicht präsentiert das ist, was Sie jetzt doin. Sie müssen Ihre Tabb-Leiste als rootview erstellen und dann in Ihrer Tableiste anzeigen. –

+0

Wie würde ich das tun? Ich habe meine Frage mit dem Storyboard-Layout aktualisiert. – user3746428

Antwort

2

Try this:

Holen Sie den Delegaten vom App-Delegaten:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

Sie sich einfach die Steuerung Sie möchten von Storyboard präsentieren:

Controller *cont=//get the reference from storyboard either using storyboard ID 

und dann RootView die anderen Controller präsentieren machen:

[appDelegate.window.rootViewController presentViewController:cont animated:YES completion:^{ 
          DLog(@"presented your view ON TOP of the tab bar controller"); 
         }]; 

Swift:

var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate() 
    var cont: Controller = //get the reference form storyboard 
    appDelegate.window.rootViewController.presentViewController(cont, animated: true, completion: { DLog("presented your view ON TOP of the tab bar controller") 

}) 

Sie können die präsentierenden Sachen auf Hauptfaden bewegen, wenn Sie mögen !!!!

+0

Noch einmal, bitte beachten Sie, dass Ihre Registerkarte muss der Root-View-Controller –

+0

Dies führt immer noch in Präsentation ohne die Tabor für mich .... Irgendeine Idee warum? Meine Ansichtshierarchie ist wie folgt: Root: Tabbar Controller -> Nav Controller -> Zielansicht. – Jerland2

0

Das Problem ist, können Sie die View-Controller setzen (genannt: rootController) zu der window?.rootViewController, andere als die rootController vom window?.rootViewController präsentiert. Ändern Sie einfach

self.window?.rootViewController = rootController 

zu

self.window?.rootViewController.presentViewController(rootController, animated: true, completion: nil) 
+0

Ah, das macht Sinn. Jedoch gibt es mir das: 'Warnung: Versuch, auf darzustellen, dessen Ansicht nicht in der Fensterhierarchie ist!' – user3746428

0

, wenn Sie es so verwenden, werden Sie RootView dieser Viewcontroller ersetzt werden. Das wird also eine neue Solo-Seite und es ist normal, dass du weder navigationController noch tabbarController hast. Weil Sie nur diese neue Seite in der Ansichtshierarchie haben. Wenn Sie dies von RootView präsentieren wollen, können Sie versuchen,

let root=UIApplication.sharedApplication().delegate as! AppDelegate 
    if let navCont=root.window?.rootViewController?.navigationController 
    { 
     navCont.presentViewController(viewControllerToPresent: UIViewController, animated: true, completion: nil) 
    } 
    else{ 
     root.window?.rootViewController?.presentViewController(viewControllerToPresent: UIViewController, animated: true, completion: nil) 
    } 
+0

Dies gibt mir die gleiche Warnung wie der Kommentar, den ich gepostet habe unter ... – user3746428

+0

oh! benutze root.window? .makeKeyAndVisible() auch. Ich habe dieses meiner alten Projekte benutzt. Es funktionierte – kocakmstf

+0

Es gibt mir immer noch die Warnung. Ich habe meinen aktualisierten Code veröffentlicht, damit Sie ihn überprüfen können. – user3746428

1

Also habe ich die Lösung, die ich, dass Hoffnung für Sie arbeiten.

Zuerst müssen Sie Ihre Storyboard-Instanz einstellen.

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

Danach müssen Sie festlegen, wo Sie die Navigation starten möchten.

let mynVC = storyboard.instantiateViewControllerWithIdentifier("root") as! UINavigationController 

jetzt können Sie die Viewcontroller festgelegt, die Sie

let playVC = storyboard.instantiateViewControllerWithIdentifier("playVC") 

So und jetzt können Sie den Workflow starten, aber beachten Sie angezeigt werden soll, dass Sie dies in einer Fertigstellung wie diese

zu tun haben

So wird Ihr rootViewController Sie "rootVC" präsentieren und danach Ihr playVC.

Ich hoffe, es wird euch helfen :)

+0

Dies führt immer noch zu einer Präsentation ohne den Tabor für mich .... Irgendeine Idee warum? Meine Ansichtshierarchie ist wie folgt: Root: Tabbar Controller -> Nav Controller -> Zielansicht. – Jerland2