UINavigationBar botón de retroceso personalizado sin título

231

¿Cómo puedo personalizar el botón de navegación hacia atrás en iOS 7 y superior sin título? (es decir, solo con la flecha)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Me pregunto si tienen self.backButtonItem;

O

¿algo como esto?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];
Kiddo
fuente
3
Puede usar @hiroshi answer + barra de navegación tintColor propiedad para hacer chevron con color personalizado y sin ningún título
Dmitry Zhukov
Para aquellos que tienen una barra de pestañas y no desean el texto del botón Atrás, la solución es: en la viewDidLoad () del TabBarController poner: self.navigationItem.backBarButtonItem = UIBarButtonItem (título: "", estilo:. simple, objetivo: nulo, acción: nulo)
Borzh

Respuestas:

313

En realidad es bastante fácil, esto es lo que hago:

C objetivo

// Set this in every view controller so that the back button displays back instead of the root view controller name
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

Swift 3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Ponga esta línea en el controlador de vista que está empujando a la pila ( el controlador de vista anterior ). El nuevo botón de retroceso del controlador de vista ahora mostrará lo que haya puesto para initWithTitle, que en este caso es una cadena vacía.

Kyle Begeman
fuente
3
Usé esto pero el título aparece y desaparece de forma animada.
user1010819
77
Gracias kyle He estado buscando una forma de cambiar el nombre del botón de retroceso predeterminado en iOS 7. Lo puse en mi prepareForSegueen el controlador de vista y funcionó perfectamente.
yiwei
1
@ user1010819 Este es el comportamiento esperado, barButtonItems se animará dentro y fuera al cambiar los controladores de vista. ¿Qué estás tratando de lograr?
Kyle Begeman
1
@YiweiGao ¡No hay problema! Es solo otra de esas cosas que si conoce el código correcto, ¡es bastante simple! ¡Me alegra que haya ayudado!
Kyle Begeman
3
Siento que esto necesita una actualización, simplemente no muestra nada en este momento, ¿la flecha no está allí por defecto?
Mathijs Segers
198

Encontré una manera fácil de hacer mi botón de retroceso con una sola flecha iOS.

Supongamos que tiene un controlador de navegación que va a ViewA desde ViewB. En IB, seleccione la barra de navegación de ViewA, debería ver estas opciones: Título, Aviso y Botón Atrás.

Ver las opciones de una barra de navegación

Ver las opciones de una barra de navegación

El truco es elegir el título del botón de retroceso del controlador de vista de destino (ViewB) en las opciones del controlador de vista anterior (Vista A). Si no completa la opción "Botón Atrás", iOS colocará el título "Atrás" automáticamente, con el título del controlador de vista anterior . Por lo tanto, debe completar esta opción con un solo espacio.

Rellene el espacio en la opción "Botón de retroceso"

Rellene el espacio en la opción "Botón de retroceso"

El resultado:

El resultado:

Thomás Calmon
fuente
Bienvenido a Stack Overflow . Si aún no lo ha hecho, eche un vistazo a lo que estamos visitando y lea algunos de los artículos en el centro de ayuda sobre cómo trabajamos y algunas de las costumbres de la comunidad aquí. Si necesita ayuda con las funciones del sitio, no tenga miedo de buscar, luego haga una pregunta sobre Meta Stack Overflow (si aún no puede encontrar una respuesta). ¡Gracias y buena suerte! De todos modos, puedes publicar tus imágenes ahora ... :)
Qantas 94 Heavy
53
funciona, solo preste atención: debe configurar el "Botón Atrás" para el controlador anterior (por ejemplo, para rootViewController en su controlador de navegación)
evfemist
Asegúrese de que no tiene "hidesBackButton" establecido en TRUE en el elemento de navegación en ViewA
shim
Me parece que esto funciona si el título del controlador presentador es lo suficientemente largo; si es un título corto, se usará en su lugar.
amergin
1
para mí sólo funciona cuando tanto el origen y destino de NavigationItem ViewController han Back Buttonestablecido en un solo carácter de espacio (es decir, tanto viewa y ViewB)
dcestari
72

¡Solo usa una imagen!

OBJ-C :

- (void)viewDidLoad {
     [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"]
                                                                                        style:UIBarButtonItemStylePlain
                                                                                       target:self.navigationController
                                                                                       action:@selector(popViewControllerAnimated:)];
     self.navigationItem.leftBarButtonItem = backButton;
}

SWIFT 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), 
                              style: .plain, 
                              target: navigationController, 
                              action: #selector(UINavigationController.popViewController(animated:)))
navigationItem.leftBarButtonItem = backBTN
navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

Icon-Back

[email protected]

Icon-Back @ 2x

[email protected]

Icon-Back @ 23x

mt81
fuente
44
Con esta solución, parece perder la funcionalidad de "deslizar para volver".
j7nn7k
16
navigationController?.interactivePopGestureRecognizer?.delegate = selfhace el truco para mantener el gesto de deslizar hacia atrás
Victor Carmouze
He estado buscando esta respuesta, tal vez toda mi vida, a saber, el selector de acción.
Des
29

iOS7 tiene nuevas reglas de interfaz, por lo que es mejor mantener al menos la flecha hacia atrás al presionar una UIView. Es muy fácil cambiar el texto "atrás" mediante programación. Simplemente agregue este código antes de presionar la vista (o prepareForSegue si está usando StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
      self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil];
}

Esto cambiará el texto predeterminado "Atrás", pero mantendrá la flecha hacia atrás con estilo iOS7. También puede cambiar el color del tinte para la flecha hacia atrás antes de presionar la vista:

- (void)viewDidLoad{
     //NavBar background color:
     self.navigationController.navigationBar.barTintColor=[UIColor redColor];
//NavBar tint color for elements:
     self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
}

¡Espero que esto te ayude!

Anibal Itriago
fuente
2
Esto funciona muy bien y parece mejor que las otras opciones. Por ejemplo, el título nunca necesita restablecerse al valor anterior, a diferencia de algunas de las otras respuestas.
pr1001
26

No hay mucho que necesites hacer. Puede lograr lo mismo a través del guión gráfico en sí.

Simplemente vaya al controlador de navegación raíz y dé un espacio. Recuerde no al controlador que deseaba el botón Atrás sin título, sino al controlador de navegación raíz.

Según la imagen a continuación.  Esto funciona para iOS 7 y iOS 8

Swaroop S
fuente
Lo he intentado, funciona. Pero todavía no puedo cambiar el título en el código.
Yu-Lin Wang
Trabajé con XCode7, pero ya no funciona en xCode8 -> ios10.X, he usado el método
@iwasrobbed
Todo genio es simple!
Illya Krit
22

Si bien la respuesta de Kyle Begeman funciona totalmente, es bastante molesto tener este código en todos los controladores de vista posibles. Terminé con una UINavigationItemcategoría simple . ¡Cuidado, aquí hay dragones! Lo siento, quiero decir, swizzling:

#import <objc/runtime.h>

@implementation UINavigationItem (ArrowBackButton)

static char kArrowBackButtonKey;

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem));
        Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem));
        method_exchangeImplementations(m1, m2);
    });
}

- (UIBarButtonItem *)arrowBackButton_backBarButtonItem {
    UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem];
    if (item) {
        return item;
    }

    item = objc_getAssociatedObject(self, &kArrowBackButtonKey);
    if (!item) {
        item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];
        objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return item;
}

@end
secondcitysaint
fuente
1
Voté, pero luego decidí usar un truco más simple en su lugar [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( fuente ), podría ser un poco menos elegante, pero el swizzling se sintió como una exageración
dmur
2
En serio ustedes ... no pasen a buscar otra solución. Implemente la solución @nicky publicada como Categoría y no lo piense dos veces. Esta es una gran solución reutilizable que se puede implementar en toda la aplicación si agrega este archivo Prefix.pch. Apple alienta el uso de categorías para agregar métodos a las clases existentes , debe aprovechar esto cuando sea posible.
zmonteca
Esta es la mejor solución en mi opinión, de todos modos el "method_exchangeImplementation" es un poco inseguro, eche un vistazo a esto: la forma correcta de swizzle y esta guía de NSHipster swizzling
Alessandro Orrù
@ AlessandroOrrù En este caso particular, esto debería ser seguro porque el método swizzled es UINavigationItemun método muy propio, no hay herencia involucrada. Y _cmdes muy poco probable que se involucre en un captador. De todos modos, es un buen punto. Entonces, si tienen alguno de estos numerosos ayudantes en su proyecto, asegúrese de usarlo aquí también.
secondcitysaint
21

EDITAR: 2014-04-09: a medida que gané reputación, lo siento porque ya no uso este truco. Recomiendo la respuesta de Kyle. También tenga en cuenta que el selfde self.navigationItem.backBarButtonItemno es el controlador de vista, se muestra el botón de retroceso, sino el controlador de vista anterior para volver.

Si no necesita tener el texto del título para el controlador de vista anterior, simplemente complete el título con una cadena en blanco;

self.navigationItem.title = @"";
[self.navigationController pushViewController:viewController animated:YES];

Esto evitará mostrar "atrás" con chevron en el controlador de vista push.

EDITAR: incluso si utiliza texto de título no en blanco, establecer el título del controlador de vista anterior en viewWillAppear:trabajos, excepto que el título puede parpadear en un parpadeo cuando aparece el controlador de vista. Creo que "La aplicación de Twitter" parece hacer un truco más sutil para evitar el parpadeo.

Hiroshi
fuente
El único problema que tuve aquí fue que cuando presioné la barra de navegación para retroceder, el título de la vista anterior queda en blanco. ¿Alguna forma de evitar eso?
Alioo
@Alioo ¿Intentó lo que mencioné en la línea "EDITAR"?
hiroshi
20

Esto funciona, pero eliminará el título del elemento anterior, incluso si vuelve a aparecer:

self.navigationController.navigationBar.topItem.title = @"";

Simplemente configure esta propiedad en viewDidLoadel controlador de vista empujado.

Guto Araujo
fuente
17
Esto eliminará el título del elemento anterior, incluso si vuelve a aparecer. No muy bueno :(
Antzi
Configuré el título del VC de inserción viewWillAppearpara que siempre esté configurado correctamente.
Guto Araujo
@GutoAraujo Funciona, pero el título vuelve a aparecer con 1 o 2 segundos de retraso, lo que hace que UX no sea tan bueno.
fuiiii
En xCode8 -> ios10.X esta parece ser la única forma de abordar el problema
LucioB
12

Así es como lo hago y la forma más simple, funciona y más clara de hacerlo.

Esto funciona si se incrusta en Navigation Controller

Swift 3

En viewDidLoadAgregar esto al controlador de vista, desea que el botón Atrás sea solo una flecha.

if let topItem = self.navigationController?.navigationBar.topItem {
   topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

La diferencia de esto con la respuesta de @Kyle Begeman es que usted llama a esto en el controlador de vista que desea que el botón de retroceso sea solo una flecha, no en el controlador de vista de pila.

r_19
fuente
7

No tiene acceso a la navegación backButtonItem de la manera que desea, necesita crear su propio botón de retroceso como a continuación:

- (void)loadView
{
    [super loadView];
    UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)];
    [backButton setImage:[UIImage imageNamed:@"back.png"]  forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
}

Y por supuesto:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}
Tarek Hallak
fuente
luego perdimos la agradable animación de desvanecimiento ocurrida en el botón Atrás
Kiddo
3
Necesitas una máscara para transiciones suaves. "* Si desea usar una imagen personalizada para reemplazar el galón predeterminado, también necesita crear una imagen de máscara personalizada. IOS 7 usa la máscara para hacer que el título de la pantalla anterior parezca emerger o desaparecer en el galón durante la navegación transiciones ".
usuario
3
¡@null perderás el gesto de deslizamiento de lado a lado de iOS 7!
Mazen Kasser
@user Obtengo la imagen personalizada pero el color del tinte es azul por defecto. ¿Cómo puedo no agregar tinte? gracias
Mazen Kasser
7

Objetivo: personalizar todos los botones de retroceso enUINavigationBarun icono blanco

Pasos: 1. en el método "didFinishLaunchingWithOptions" de AppDelete :

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"];


if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [UINavigationBar appearance].tintColor = [UIColor whiteColor];
    [UINavigationBar appearance].backIndicatorImage = backBtnIcon;
    [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon;
}else{

    UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
}

2.en el viewDidLoadmétodo de la superclase común ViewController:

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                     style:UIBarButtonItemStylePlain
                                                                    target:nil
                                                                    action:nil];
        [self.navigationItem setBackBarButtonItem:backItem];
    }else{
        //do nothing
    }
Jagie
fuente
Esto muestra una advertencia "La versión implícita de SYSTEM_VESION _..." no es válida en C99.
Jayprakash Dubey
7

SWIFT 4

Para aquellos que buscan crear botones de retroceso personalizados y eliminar su título, use el siguiente código dentro del controlador de vista que está presionando el nuevo:

self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
self.navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Para un uso más universal, haga lo siguiente:

  1. Cree una función universal de la siguiente manera:

    func addCustomizedBackBtn(navigationController: UINavigationController?, navigationItem: UINavigationItem?) {
        navigationController?.navigationBar.backIndicatorImage = UIImage(named: "close")
        navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "close")
        navigationItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
  2. Luego úselo en los controladores de vista de la siguiente manera:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)
Nino Bouchedid
fuente
6

El hack simple de iOS6 también funciona en iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

Editar: no uses este truco. Ver comentario para más detalles.

Z h.
fuente
66
No uses este truco. Hay un error en el código de Apple en los dispositivos de 64 bits que evitará que aparezcan vistas modales cuando realice un desplazamiento del título del botón de la barra. Más detalles .
zh.
Bueno, solo hubo problemas en el dispositivo, no en el simulador.
zh.
Este truco ya no funciona cuando se construye con Xcode 9 / iOS 11. El "<" aparecerá demasiado bajo y verá restricciones rotas cuando se ejecute en el depurador.
T'Pol
3

Puedes usar esto. Esto funciona perfectamente para mí simplemente agregando un UIButtoncomo una vista personalizada para el UIBarButtonItem.

Pruebe el siguiente código

    self.navigationItem.leftBarButtonItem=[self backButton];


- (UIBarButtonItem *)backButton
{
    UIImage *image = [UIImage imageNamed:@"back-btn.png"];
    CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [button setImage:image forState:UIControlStateNormal];

    UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button];

    return item;
}
Abhilash Reddy Kallepu
fuente
3
sin embargo, esto deshabilitará el gesto de deslizar hacia atrás en iOS 7
user102008
3

Cree un UILabelcon el título que desee para su controlador de vista raíz y asígnelo al controlador de vista navigationItem.titleView.

Ahora configure el título en una cadena vacía y el siguiente controlador de vista que presione tendrá un botón de retroceso sin texto.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";
Rounak
fuente
3
 // add left bar button item

try this code:

- (void)viewDidLoad
{ 
    [super viewDidLoad];

   UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"];
    CGRect backframe = CGRectMake(250, 9, 15,21);
    UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe];
    [backbutton setBackgroundImage:image_back forState:UIControlStateNormal];
    [backbutton addTarget:self action:@selector(Btn_back:)
         forControlEvents:UIControlEventTouchUpInside];
    [backbutton setShowsTouchWhenHighlighted:YES];
    UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton];
    self.navigationItem.leftBarButtonItem=backbarbutton;
    [backbutton release];

}
-(IBAction)Btn_back:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];

}
Paresh Hirpara
fuente
3

Todas las respuestas no resuelven el problema. No es aceptable establecer el título del botón de retroceso en cada controlador de vista y agregar desplazamiento al título todavía hace que el próximo título del controlador de vista se desplace a la derecha.

Aquí está el método que usa el método swizzling, solo cree una nueva extensión para UINavigationItem

import UIKit

extension UINavigationItem {
    public override class func initialize() {

    struct Static {
        static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== UINavigationItem.self {
        return
    }

    dispatch_once(&Static.token) {
        let originalSelector = Selector("backBarButtonItem")
        let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem)

        let originalMethod = class_getInstanceMethod(self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

// MARK: - Method Swizzling

struct AssociatedKeys {
    static var ArrowBackButtonKey = "noTitleArrowBackButtonKey"
}

func noTitleBackBarButtonItem() -> UIBarButtonItem? {
    if let item = self.noTitleBackBarButtonItem() {
        return item
    }

    if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem {
        return item
    } else {
        let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
        objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        return newItem
    }
}
}
jakub wolanski
fuente
Establecer el botón Atrás en la palabra Atrás, funciona muy bien: self.navigationItem.backBarButtonItem.title = @ "Atrás";
Mike Zriel
¿Qué quieres decir amigo? ¿La pregunta era sobre eliminar texto del botón Atrás?
jakub wolanski
1
Muchas aplicaciones y aplicaciones propias de Apple dicen "<Atrás", por lo que es bueno seguir el estándar. BigTakeAway y JustEat.
Mike Zriel
2

Apliqué el siguiente código en viewDidLoad y funciona:

  // this will set the back button title
self.navigationController.navigationBar.topItem.title = @"Test";

 // this line set the back button and default icon color  

//[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

this line change the back default icon to your custom icon
[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Solo para actualizar, uso Vector Icon

Hajra Qamar
fuente
2

Puede subclasificar UINavigationController, establecerse como delegado y establecer backBarButtonItem en el método delegado navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate>

@end

@implementation Custom_NavigationController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.delegate = self;
}

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController     willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

@end
Nate Potter
fuente
2

Establecer título vacío

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@""  style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)];
[backButton setTintColor:Color_WHITE];
[self.navigationItem setBackBarButtonItem:backButton];

Cambiar imagen posterior

 UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[UINavigationBar appearance].backIndicatorImage = backImg;
[UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;
guerrero
fuente
1

He estado usando esta solución desde iOS 5 más o menos sin ningún problema. Hice una función de utilidad que llamo en mis controladores de vista. Debe hacerlo en viewDidLoad o en cualquier punto posterior.

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text)
{
    if(! viewController.navigationItem.backBarButtonItem)
    {
        viewController.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:text
                                         style:UIBarButtonItemStylePlain
                                        target:nil action:nil];
    }
    else
    {
        viewController.navigationItem.backBarButtonItem.title = text;
    }
}

En algunos casos, el elemento de navegación ya puede existir, en otros casos necesita ser creado. Esto explica ambos casos sin alterar el título del elemento de navegación. Le permite eliminar el título simplemente pasando @"".

Dima
fuente
1
Esta es la respuesta correcta. Sin trucos. Esto solo está usando la API de iOS de la manera en que estaba destinada a usarse, para establecer el título. Ajústelo a @ "" para eliminar el título (probado y funciona bien).
n13
1

La única forma que funcionó para mí fue:

navigationController?.navigationBar.backItem?.title = ""

ACTUALIZAR:

Cuando cambié el indicador de animación de segue a verdadero (antes era falso), la única forma que funcionó para mí fue:

navigationController?.navigationBar.topItem?.title = ""
Siamaster
fuente
1

Si tiene dos ViewController (FirstVC, SecondVC) incrustados en el controlador de navegación, y desea que solo haya una flecha hacia atrás en SecondVC.

Puedes probar esto en ViewDidLoad de FirstVC

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}

Luego, cuando ingrese a SecondVC, verá que solo hay una flecha hacia atrás

Yu-Lin Wang
fuente
1

Si configura el tintColor Of NavigationBar, agregue una imagen de botón de retroceso personalizada sin título para que el color de tinte refleje el color de la imagen. Siga este enlace de Apple Document.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init];
   navBar.tintColor = self.tintColor;

   UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"];
     myImage = [myImage              imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)];
     navItem.leftBarButtonItem = leftButton;

    navBar.items = @[ navItem ];
Nazish Ali
fuente
1

Estoy escrito una extensión para hacer esto más fácil:

extension UIViewController {

    /// Convenience for setting the back button, which will be used on any view controller that this one pushes onto the stack
    @objc var backButtonTitle: String? {
        get {
            return navigationItem.backBarButtonItem?.title
        }
        set {
            if let existingBackBarButtonItem = navigationItem.backBarButtonItem {
                existingBackBarButtonItem.title = newValue
            }
            else {
                let newNavigationItem = UIBarButtonItem(title: newValue, style:.plain, target: nil, action: nil)
                navigationItem.backBarButtonItem = newNavigationItem
            }
        }
    }

}
Mark Bridges
fuente
1

Puede cambiar el título a @ "" del ViewController actual en viewWillDisappear, y cuando esté a punto de volver a mostrarse, vuelva a configurar el título a lo que era antes.

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.title = @"Previous Title";
}

-(void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.title = @"";
}
WaleedAmmari
fuente
0

En el método prepareForSegue: de su primer ViewController, establece el título de las vistas en @ "", de modo que cuando se presiona la siguiente vista, mostrará el título anterior de ViewController, que será @ "".

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    self.navigationItem.title = @" ";
}

El único problema con esto es que cuando presiona el botón Atrás, su vista anterior no tendrá un título, por lo que puede agregarlo nuevamente en viewWillAppear:

-(void)viewWillAppear:(BOOL)animated{
   self.navigationItem.title = @"First View Title";
}

No me gusta mucho esta solución, pero funciona y no encontré otra forma de hacerlo.

Alejandro Figueroa
fuente
Vea mi respuesta para la solución correcta sin meterse con el título del elemento de navegación.
Dima
¿Su solución mantiene la flecha hacia atrás de iOS7? Intenté algo similar pero eliminó la flecha.
Alejandro Figueroa
Mantiene la flecha hacia atrás en iOS 7, sí. Sin embargo, en iOS 6, pasar una cadena en blanco (longitud 0) también eliminará el botón por completo, por lo que hacer esto solo es realmente bueno para iOS 7.
Dima
Hay una solución muy simple. Mira si mi respuesta te funciona.
Guto Araujo
0

Para agregar a la respuesta anterior de Thomas C , a veces poner un solo espacio no funciona y hay que seguir agregando espacios.

botón de barra vacía

Sabrá que tuvo éxito cuando vea "Elemento del botón de barra -" debajo del "Elemento de navegación". Eso está en el esquema del documento (Editor-> Mostrar esquema del documento). Una vez que vea la imagen de arriba, puede eliminar algunos espacios y ver si aún funciona.

Rog182
fuente
0
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom initialization
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

    }
    return self; 
}

Al igual que Kyle Begeman, agrega el código anterior en su controlador de vista raíz. Se aplicará todo el controlador de vista secundaria. Además, agregando esto en initWithCoder: método, puede aplicar el estilo para controladores de vista raíz en xib, storyboard o enfoques basados ​​en código.

Chris So
fuente