2015-09-28 27 views
10

Wprowadzam skróty ekranu głównego za pomocą 3D Touch i działa dobrze, jednak sposób, w jaki aktualnie go mam, oznacza, że ​​gdy skrót przenosi użytkownika do określonego kontrolera widoku, zakładka Pasek i pasek nawigacyjny brakuje.Brak paska nawigacji i paska kart podczas przedstawiania kontrolera widoku

To jest mój kod:

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 
} 

Może ktoś sugerują, co muszę zmienić w kodzie?

To sterburta układ (FavouritesTableViewController jest wskazany):

enter image description here

EDIT:

Tu jest mój zaktualizowany kod:

@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

jeśli ich brakuje, to jesteś prezentując je z okna widoku głównego, który jest tym, co robisz teraz. Musisz ustawić pasek tabbowy jako rootview, a następnie przedstawić go w swoim pasku zakładek. –

+0

Jak to zrobić? Zaktualizowałem swoje pytanie za pomocą układu storyboardów. – user3746428

Odpowiedz

2

Spróbuj tego:

Uzyskaj delegata z delegata aplikacji:

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

dostać kontroler chciałbyś zaprezentować z ujęć:

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

a następnie dokonać rootview przedstawić inny kontroler:

[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") 

}) 

możesz przenosić prezentację na główny wątek, jeśli chcesz !!!! aby być window?.rootViewController, inne niż prezentując rootController przez window?.rootViewController:

+0

Po raz kolejny, proszę zauważyć, że twój pasek musi być kontrolerem widoku root –

+0

To nadal powoduje prezentację bez tabor dla mnie .... Każdy pomysł, dlaczego? Moja hierarchia widoków wygląda następująco: Root: Controller Tabbar -> Nav controller -> destinationView. – Jerland2

0

Problem konfigurowania kontrolera widoku (rootController nazwie) jest. Wystarczy zmienić

self.window?.rootViewController = rootController 

do

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

Ach, to ma sens. Jednak to daje mi to: 'Ostrzeżenie: Próba zaprezentowania na którego widok nie znajduje się w hierarchii okien!' – user3746428

0

jeśli używasz go tak zostanie zastąpiony rootview do tego viewcontroller. Tak więc będzie to nowa strona solowa i jej normalne, aby nie mieć navigationController lub tabbarController. Ponieważ masz tylko tę nową stronę w widoku hierarchii. Jeśli chcesz zaprezentować to od rootview, można spróbować

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

To daje mi takie samo ostrzeżenie co komentarz, który opublikowałem poniżej ... – user3746428

+0

oh! również użyj root.window? .makeKeyAndVisible(). użyłem tego jednego z moich starych projektów. To działało – kocakmstf

+0

Wciąż daje mi ostrzeżenie. Opublikowaliś my zaktualizowany kod, aby można go sprawdzić. – user3746428

1

Więc mam rozwiązanie Mam nadzieję, że będzie pracować dla Ciebie.

Najpierw musisz ustawić instancję Storyboard.

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

po tym musisz ustawić, gdzie chcesz rozpocząć nawigację.

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

teraz można ustawić viewcontroller który ma się pojawić

let playVC = storyboard.instantiateViewControllerWithIdentifier("playVC") 

tak i teraz można uruchomić przepływ pracy należy jednak pamiętać, że trzeba to zrobić w realizacji tak

self.window?.rootViewController?.presentViewController(rootVC, animated: true, completion: {() -> Void in 
      rootVC.pushViewController(playVC, animated: true) 
     }) 

Twój rootViewController wyświetli "rootVC", a po nim Twoje playVC.

Mam nadzieję, że to pomoże Ci faceci :)

+0

To nadal powoduje prezentację bez taboru dla mnie .... Jakiś pomysł dlaczego? Moja hierarchia widoków wygląda następująco: Root: Controller Tabbar -> Nav controller -> destinationView. – Jerland2

Powiązane problemy