example ios swift uinavigationcontroller

ios - navigation controller swift 4 example



Botón y destino personalizados de Swift (4)

Aquí hay una versión actualizada para Swift 2 / 2.1:

self.navigationController? .setNavigationBarHidden(false, animated:true) let backButton = UIButton(type: UIButtonType.Custom) backButton.addTarget(self, action: "methodCall:", forControlEvents: UIControlEvents.TouchUpInside) backButton.setTitle("TITLE", forState: UIControlState.Normal) backButton.sizeToFit() let backButtonItem = UIBarButtonItem(customView: backButton) self.navigationItem.leftBarButtonItem = backButtonItem

Actualmente estoy usando SWRevealViewController para un menú de barra lateral en mi aplicación. Cuando hago clic en una de las opciones, el controlador de vista de destino no tiene un botón "atrás" porque no proviene de un controlador de vista adecuado (es decir, la página para volver a).

Por lo tanto, deseo crear manualmente un botón Atrás en el controlador de vista de destino que volverá al controlador de vista de inicio.

He visto el código aquí: ¿Cómo configuro manualmente el destino "Atrás" en las aplicaciones de iOS?

Pero estoy luchando para implementar esto en Swift (un error tras otro!). ¿Alguna ayuda? ¡Gracias!

EDITAR

He intentado la sugerencia a continuación, pero el botón Atrás simplemente no aparece. Esto puede tener algo que ver con el hecho de que tengo la barra de navegación oculta en otras vistas y hago lo siguiente en la vista de destino:

override func viewDidLoad() { super.viewDidLoad() navigationController.setNavigationBarHidden(false, animated:true) var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside) var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func popToRoot(sender:UIBarButtonItem){ self.navigationController.popToRootViewControllerAnimated(true) }

¿No está seguro de por qué el botón Atrás no se mostrará?

Editar

Este es el prepareForSegue de mi controlador de vista de barra lateral. Si hay una forma de verificar el identificador de segue ''prueba'', ¿puedo configurar el botón Atrás desde aquí?

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender { // Set the title of navigation bar by using the menu items NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController; destViewController.title = [[_menuItems objectAtIndex:indexPath.row] capitalizedString]; if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) { SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue; swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController; [navController setViewControllers: @[dvc] animated: NO ]; [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; }; } }


En Swift 2.1

Estoy personalizando los elementos de la barra de navegación de esta manera

  • Puedo cambiar la imagen de fondo de la barra de navegación, el texto del título, el color del texto
  • Puedo mostrar / ocultar el botón atrás
  • Puedo cambiar Título / Icono o método de acción personalizado

En AppDelegate tengo

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //Cutomize navigation bar let navBgImage:UIImage = UIImage(named: "dummy_navigation_bg_image")! UINavigationBar.appearance().setBackgroundImage(navBgImage, forBarMetrics: .Default) UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]; return true }

En ViewController actualizo los elementos de navegación en el método viewWillAppear de esta manera

override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) setupNavigationBar() } // MARK: - NavigationBar methods func setupNavigationBar () { //current tab screen title tabBarController?.title = "Manage" //Hide back button or left bar button tabBarController?.navigationItem.leftBarButtonItem = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil) //custom right bar button var image = UIImage(named: "dummy_settings_icon") image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: self, action: "settingButtonAction") } func settingButtonAction() { print("Setting Button tapped") performSegueWithIdentifier("loadAccountSettingsSegue", sender: nil) }


Puedes escribir eso en rápido como este

Escribe esto para agregar el botón en navigationController

navigationController.setNavigationBarHidden(false, animated:true) var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside) myBackButton.setTitle("YOUR TITLE", forState: UIControlState.Normal) myBackButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal) myBackButton.sizeToFit() var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem

esto aparecerá en rootViewController

func popToRoot(sender:UIBarButtonItem){ self.navigationController.popToRootViewControllerAnimated(true) }


Solución Swift 3.0 :

self.navigationController?.setNavigationBarHidden(false, animated:false) //Create back button of type custom let myBackButton:UIButton = UIButton.init(type: .custom) myBackButton.addTarget(self, action: #selector(ViewController.popToRoot(sender:)), for: .touchUpInside) myBackButton.setTitle("Back".localized(), for: .normal) myBackButton.setTitleColor(.blue, for: .normal) myBackButton.sizeToFit() //Add back button to navigationBar as left Button let myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton) self.navigationItem.leftBarButtonItem = myCustomBackButtonItem func popToRoot(sender:UIBarButtonItem){ _ = self.navigationController?.popToRootViewController(animated: true) }