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