ios - prefer - Cree un botón de retroceso izquierdo personalizado en UINavigationBar CON la flecha estándar de la izquierda
swift navigation bar large title (6)
Finalmente, aquí está el fragmento que utilizo para definir el título del botón Atrás con la flecha izquierda estándar en la vista actual , no en la vista principal :
- (void)viewDidLoad {
[super viewDidLoad];
[self setTitle:@"Current View"];
// Get the previous view controller
UIViewController *previousVC = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];
// Create a UIBarButtonItem
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"FooBar" style:UIBarButtonItemStyleBordered target:self action:@selector(yourSelector)];
// Associate the barButtonItem to the previous view
[previousVC.navigationItem setBackBarButtonItem:barButtonItem];
}
Aquí está el resultado:
Nota: Sin embargo, ya que no es posible agregar una acción en un backBarButtonItem, puede consultar esta gran publicación si así lo desea.
Actualizado para Swift
// Prev - no chevron...
//navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back !", style: .plain, target: self, action: #selector(backPressed))
// adds the chevron
let vc = navigationController?.viewControllers.first
let button = UIBarButtonItem(title: "Go Back", style: .plain, target: self, action: #selector(backPressed))
vc?.navigationItem.backBarButtonItem = button
Cuando creo un botón de retroceso personalizado, uso el siguiente código:
UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"Yeah" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressed:)];
self.navigationItem.leftBarButtonItem = leftButton;
Esto funciona bien, y obtengo este resultado:
Tendría el mismo resultado, pero con una flecha a la izquierda, como esta (cuando es un botón de retroceso estándar, no uno personalizado):
¿Cómo puedo simplemente añadir esta flecha?
Lo más fácil sería establecer el título en el controlador principal (es decir, el que desea volver a navegar). Si no desea que este sea el mismo que el título real que se muestra en la vista de ese VC, puede cambiar el título en la vista. Desaparecerá lo que desee en el botón Atrás del próximo VC, y luego cambiarlo de nuevo a lo que desea en el padre en viewWillAppear.
Si está utilizando guiones gráficos, también puede establecer el título posterior directamente en IB.
Finalmente, para crear un botón de retroceso personalizado, puedes hacer algo como:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Details" style:UIBarButtonItemStyleBordered target:nil action:nil];
... solo asegúrese de hacer esto en el controlador de vista de presentación (o padre), no en el controlador de vista que se está cargando (el controlador presentado).
Para Swift, usando la respuesta de Erzekiel como base para esto, puedes simplificarlo a ...
extension UIViewController {
func setBackButtonTitle(to title: String) {
let barButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil)
self.navigationItem.backBarButtonItem = barButtonItem
}
}
Esto debe llamarse desde el controlador de vista principal, por ejemplo, en viewWillDisappear -
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.setBackButtonTitle(to: "Back"))
}
Yo uso el código como:
UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] init];
leftBar.title = @"Back";//Details
self.navigationController.navigationBar.topItem.backBarButtonItem = leftBar;
así que tienes que ir con una imagen de fondo y con título y
// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
style:UIBarButtonItemStyleBordered
target:self
action:@selector(backAction)];
tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
UIButton * backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside];
[backButton setFrame:FRAME_DEFINE
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton setExclusiveTouch:YES];
[backButton setImage:[UIImage imageNamed:BACK_BUTTON_DEFAULT_ICON] forState:UIControlStateNormal];
[backButton setTitle:@"BACK" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
UIBarButtonItem *backMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backMenuBarButton;