¿Cómo ocultar el botón "atrás" en UINavigationController?

158

¿Sabes cómo ocultar el botón 'atrás' en un UINavigationController? Además, cómo mostrarlo de vuelta, pero supongo que es muy similar a ocultarlo ...

Al igual que la aplicación de correo en el iPhone cuando presionas 'Editar' mientras ves correos electrónicos.

Zoran Simic
fuente

Respuestas:

313

Acabo de encontrar la respuesta, en un controlador use esto:

[self.navigationItem setHidesBackButton:YES animated:YES];

Y para restaurarlo:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[ACTUALIZAR]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)
Zoran Simic
fuente
18
También aprenda de mi error: debe llamar setHidesBackButton:ANTES de empujar el elemento NavigationItem al control de navegación.
codingFriend1
porque antes ¿Qué pasa si desea presionar un control ViewController y luego ocultar el botón Atrás para evitar que el usuario regrese?
user4951
1
@codingFriend: creo que esto también funciona si coloca setHidesBackButton en el controlador de mensajes viewDidAppear de la vista en la que no desea mostrar el botón de retroceso.
Anon
2
Los mejores eventos para esto son viewWillAppear:animatedocultarlo y viewWillDisappear:animatedrestaurarlo.
pechar
Finalmente, algo que Apple no ha cambiado en Xcode. Más de 5 años después y esta respuesta aún funciona muy bien.
Aplicación Dev Guy
27

Agregue este código

[self.navigationItem setHidesBackButton:YES];
visakh7
fuente
22

Además de eliminar el botón de retroceso (utilizando los métodos ya recomendados), no olvide que el usuario todavía puede 'abrir' la pantalla anterior con un gesto de deslizamiento de izquierda a derecha en iOS 7 y versiones posteriores.

Para deshabilitar eso (cuando corresponda), implemente lo siguiente (en viewDidLoad, por ejemplo):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;
mattv123
fuente
1
Matt - +1 para ti. Gracias por agregar esta nota. Muy útil. Para cualquiera que se pregunte cómo funciona el gesto pop, simplemente deslice de izquierda a derecha en su barra de navegación para recrear lo que Matt está describiendo aquí. Agregar el código anterior evita que el usuario haga esto en el controlador de vista donde está incluido.
noobzilla
18

Solo para aclarar las respuestas existentes: la hidesBackButtonpropiedad es la respuesta correcta, pero en muchas respuestas no está claro a qué se selfrefiere. Básicamente, debe configurar self.navigationItem.hidesBackButton = YESen el controlador de vista que está a punto de ser empujado (o simplemente empujado) en el UINavigationController.

En otras palabras, digamos que tengo un UINavigationControllernombre myNavController. Quiero ponerle una nueva vista, y cuando lo haga, no quiero que se muestre más el botón Atrás. Podría hacer algo como:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

Cuando finalice el código, la vista controlada por newVCahora debería mostrarse y no debería verse ningún botón de retroceso.

Mate
fuente
Exactamente lo que necesitaba, ya que primero estaba haciendo NavigationController.NavigationItem. Gracias Matt
Chucky
16

Para ocultar y mostrar el botón Atrás condicionalmente, puede usar el siguiente código:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

Nota: en algunos casos, debe ponerlo en el método viewDidAppear en lugar de viewWillAppear, tales como: cuando está actualizando la matriz de la siguiente clase en la clase anterior y luego verificando la condición en la siguiente clase como se indicó anteriormente.

Sandip Patel - SM
fuente
11

Swift iOS (he usado lo siguiente)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing
Vinod Joshi
fuente
10

sethidesbackbutton no funcionó para mí por alguna razón

Solía ​​de esta manera ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;
M.Othman
fuente
gracias ... Tuve el mismo problema donde setHidesBackButton: YES no funcionó. pero esta solución funcionó para iOS 7.
mohsinj
6

En mi caso tuve algunos problemas con las respuestas actuales:

  • inside viewDidLoad / viewWillAppear solo el ícono de atrás estaba oculto y la cadena "Atrás" estaba inactiva pero aún visible
  • view insideDidAppear el botón de retroceso desapareció ... pero no quería que el usuario lo viera en absoluto

Entonces, la solución que finalmente funcionó para mí es:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}
micromanc3r
fuente
3

La solución sugerida por Zoran Simic no funcionó para mí por alguna razón.

Sin embargo, este código funcionó:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

Obviamente, tendrías que manipular un NSArray a tu gusto para que funcione para ti. Espero que ayude a alguien :)

PowerAktar
fuente
¡Gracias por esto! Estaba luchando contra un error extraño y esto funcionó. No es para todos, pero es útil en los casos correctos.
Brandon
1

En mi subclase UIViewController tengo este método:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated: animated];

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}
neoneye
fuente
0

Esto oculta el botón Atrás y lo reemplaza con un botón Agregar en Swift:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}
David Weiss
fuente
0

Swift 3.

En general, debe usar la API por ViewController de Apple como se describe muchas veces en esta página, pero a veces necesita el control inmediato del botón Atrás.

El siguiente código oculta el botón Atrás y garantiza que la detección de colisión de golpe no se produzca en la región del botón oculto.

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)
Womble
fuente
0

Esto oculta el botón de retroceso

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


navigationItem.leftBarButtonItem = backBtn
Zeeshan
fuente