ios - bar - presenta ViewController con NavigationViewController swift
root view controller navigation controller (4)
Tengo el sistema "NavigationViewController -> MyViewController", y programáticamente quiero presentar MyViewController dentro de un tercer controlador de vista. El problema es que no tengo barra de navegación en MyViewController luego de presentarlo. ¿Me puedes ayudar?
var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("MyViewController") as ViewController
self.presentViewController(VC1, animated:true, completion: nil)
Llamar a presentViewController
presenta el controlador de vista modalmente , fuera de la pila de navegación existente; no está contenido en su UINavigationController ni en ningún otro. Si desea que su nuevo controlador de vista tenga una barra de navegación, tiene dos opciones principales:
Opción 1. Presione el nuevo controlador de vista en su pila de navegación existente, en lugar de presentarlo de manera modal:
let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
self.navigationController!.pushViewController(VC1, animated: true)
Opción 2. Incruste su nuevo controlador de vista en un nuevo controlador de navegación y presente el nuevo controlador de navegación de manera modal:
let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1) // Creating a navigation controller with VC1 at the root of the navigation stack.
self.present(navController, animated:true, completion: nil)
Tenga en cuenta que esta opción no incluirá automáticamente un botón "Atrás". Tendrás que construir tú mismo un mecanismo cerrado.
Cuál es el mejor para usted es una pregunta de diseño de interfaz humana, pero normalmente está claro qué tiene más sentido.
Mi barra de navegación no se muestra, por lo que he utilizado el siguiente método en Swift 2 iOS 9
dejar viewController = self.storyboard? .instantiateViewControllerWithIdentifier ("Dashboard") como! Tablero
// Creating a navigation controller with viewController at the root of the navigation stack.
let navController = UINavigationController(rootViewController: viewController)
self.presentViewController(navController, animated:true, completion: nil)
SWIFT 3
let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
Usé una extensión para UIViewController y una estructura para asegurarme de que mi vista actual se presenta desde los favoritos
1.Struct para un Bool global
struct PresentedFromFavourites {
static var comingFromFav = false}
Extensión de 2.UIVeiwController: presentado de forma modal como en la segunda opción por "stefandouganhyde - Opción 2" y resolviendo el problema
extension UIViewController {
func returnToFavourites()
{
// you return to the storyboard wanted by changing the name
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let mainNavigationController = storyBoard.instantiateViewController(withIdentifier: "HomeNav") as! UINavigationController
// Set animated to false
let favViewController = storyBoard.instantiateViewController(withIdentifier: "Favourites")
self.present(mainNavigationController, animated: false, completion: {
mainNavigationController.pushViewController(favViewController, animated: false)
})
}
// call this function in viewDidLoad()
//
func addBackToFavouritesButton()
{
if PresentedFromFavourites.comingFromFav
{
//Create a button
// I found this good for most size classes
let buttonHeight = (self.navigationController?.navigationBar.frame.size.height)! - 15
let rect = CGRect(x: 2, y: 8, width: buttonHeight, height: buttonHeight)
let aButton = UIButton(frame: rect)
// Down a back arrow image from icon8 for free and add it to your image assets
aButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
aButton.backgroundColor = UIColor.clear
aButton.addTarget(self, action:#selector(self.returnToFavourites), for: .touchUpInside)
self.navigationController?.navigationBar.addSubview(aButton)
PresentedFromFavourites.comingFromFav = false
}
}}