2015-09-28 12 views
10

Sto implementando scorciatoie della schermata iniziale utilizzando 3D Touch, e funziona bene, tuttavia il modo in cui attualmente lo faccio significa che quando il collegamento porta l'utente a un controller specifico, la scheda barra e barra di navigazione mancano.Manca la barra di navigazione e la barra di comando quando si presenta il controller di visualizzazione

Questo è il mio codice:

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 
} 

Qualcuno può suggerire che cosa ho bisogno di cambiare il codice?

Questo è il layout di dritta (FavouritesTableViewController è indicato):

enter image description here

EDIT:

Qui è il mio codice aggiornato:

@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

se mancano, allora si sta presentando dalla visualizzazione radice finestra che è quello che stai facendo ora. Devi fare la tua barra di tabb come rootview e quindi presentarla nella tua barra delle schede –

+0

Come faccio? Ho aggiornato la mia domanda con il layout dello storyboard. – user3746428

risposta

2

Prova questo:

Ottieni il delegato dal delegato dell'app:

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

Prendi il controller che si desidera presentare da storyboard:

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

e quindi rendere il vostro rootview presentare l'altro controller:

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

}) 

puoi spostare le presentazioni sul thread principale, se ti va !!!!

+0

Ancora una volta, tieni presente che la tua tabbar deve essere il controller della vista radice –

+0

Ciò risulta comunque nella presentazione senza il tabor per me .... Qualche idea sul perché? La mia gerarchia di vista è la seguente: Root: Tabbar Controller -> Nav controller -> destinationView. – Jerland2

0

Il problema è, si sta impostando il controller della vista (dal nome: rootController) di essere il window?.rootViewController, oltre a presentare il rootController dal window?.rootViewController. Basta cambiare

self.window?.rootViewController = rootController 

a

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

Ah, questo ha senso. Comunque mi sta dando questo: 'Attenzione: Tentativo di presentare on la cui vista non è nella gerarchia della finestra!' – user3746428

0

se lo si utilizza in questo modo vi sarà sostituito rootview a questo viewcontroller. Quindi questa sarà una nuova pagina da solo ed è normale non avere navigationController o tabbarController. Perché hai solo questa nuova pagina nella gerarchia delle viste. Se si desidera presentare tale da rootview, si può provare

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

Questo mi dà lo stesso avvertimento del commento che ho postato in basso ... – user3746428

+0

oh! usa anche root.window? .makeKeyAndVisible(). ho usato questo dei miei vecchi progetti. Stava funzionando – kocakmstf

+0

Mi sta ancora avvertendo. Ho pubblicato il mio codice aggiornato in modo da poterlo verificare. – user3746428

1

così ho preso la soluzione spero che lavorerà per voi.

Per prima cosa devi impostare l'istanza di Storyboard.

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

dopo che è necessario impostare dove si desidera avviare la navigazione.

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

in questo momento è possibile impostare il viewcontroller che si desidera visualizzare

let playVC = storyboard.instantiateViewControllerWithIdentifier("playVC") 

Così e ora è possibile avviare il flusso di lavoro, ma notare che si deve fare questo in un completamento come questo

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

Quindi il tuo rootViewController ti presenterà "rootVC" e successivamente il tuo playVC.

Spero che vi aiuterà a ragazzi :)

+0

Questo risulta ancora nella presentazione senza il tabor per me .... Qualche idea del perché? La mia gerarchia di vista è la seguente: Root: Tabbar Controller -> Nav controller -> destinationView. – Jerland2

Problemi correlati