tab item bar ios swift uiviewcontroller uinavigationbar uitabbar

ios - item - uitabbarcontroller programmatically swift 4



Falta la barra de navegaciĆ³n y pestaƱas al presentar el controlador de vista (4)

Estoy implementando accesos directos a la pantalla de inicio con 3D Touch, y está funcionando bien, sin embargo, la forma en que lo tengo significa que cuando el acceso directo lleva al usuario a un controlador de vista específico, la barra de pestañas y la barra de navegación faltan.

Este es mi código:

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 }

¿Alguien puede sugerir lo que necesito cambiar en el código?

Este es el diseño de estribor (FavouritesTableViewController está indicado):

EDITAR:

Aquí está mi código actualizado:

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


Prueba esto:

Obtener el delegado del delegado de la aplicación:

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

GET el controlador que le gustaría presentar desde el guión gráfico:

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

y luego haz que tu vista de root presente el otro controlador:

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

Rápido:

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

puedes mover las cosas que se presentan en el hilo principal, si quieres !!!!


El problema es que está configurando el controlador de vista (denominado: rootController ) como la window?.rootViewController , además de presentar el rootController por la window?.rootViewController . Solo cambia

self.window?.rootViewController = rootController

a

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


si lo usa así, será reemplazado con rootview a este controlador de vista. Así que esta será una nueva página en solitario y es normal que no tenga navigationController o tabbarController. Porque solo tiene esta nueva página en jerarquía de vista. Si desea presentar esto desde la vista de raíz, puede intentar

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


Así que obtuve la solución, espero que funcione para usted.

Primero tienes que configurar tu instancia Storyboard.

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

después de eso, debe establecer dónde desea iniciar la navegación.

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

ahora mismo puede configurar el controlador de visualización que desea que aparezca

let playVC = storyboard.instantiateViewControllerWithIdentifier("playVC")

Por lo tanto, ahora puede iniciar el flujo de trabajo, pero tenga en cuenta que tiene que hacer esto en una finalización como esta

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

Por lo tanto, su rootViewController le presentará "rootVC" y luego su playVC.

Espero que les ayude chicos :)