„Przycisk wstecz” a UINavigationController
domyślnie pokazuje tytuł ostatniego widoku w stosie. Czy zamiast tego można umieścić niestandardowy tekst na przycisku Wstecz?
„Przycisk wstecz” a UINavigationController
domyślnie pokazuje tytuł ostatniego widoku w stosie. Czy zamiast tego można umieścić niestandardowy tekst na przycisku Wstecz?
Odpowiedzi:
Z tego linku :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Jak powiedział Tyler w komentarzach:
nie rób tego w widocznym kontrolerze widoku, ale w kontrolerze widoku, który zobaczysz po naciśnięciu przycisku Wstecz
release
UIBarButtonItem
UIBarButtonItemStyleBordered
na wywołanie właściwości self.navigationItem.backBarButtonItem.style
. Dokumentacja: developer.apple.com/library/ios/documentation/uikit/reference/…
Możesz ustawić tekst w Interface Builder:
Wybierz element nawigacyjny kontrolera ViewController, do którego powróci przycisk Wstecz:
W inspektorze atrybutów panelu narzędzi wprowadź etykietę dla przycisku Wstecz:
Wolałbym takie podejście niż umieszczanie tytułu w kodzie, jak w zaakceptowanej odpowiedzi.
Zauważ również, że musisz to zrobić w kontrolerze widoku o jeden poziom wyżej w stosie. Innymi słowy, nie rób tego w widocznym kontrolerze widoku, ale w kontrolerze widoku, który zobaczysz po naciśnięciu przycisku Wstecz.
- Tyler
Używam tego:
// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.backItem.title = @"Custom text";
}
Znalazłem poręczne rozwiązanie tego problemu, ustawiając po prostu tytuł kontrolera przed umieszczeniem innego kontrolera na stosie, na przykład:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Następnie ustaw oryginalny tytuł w viewWillAppear
, na przykład:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Działa to, ponieważ domyślnym zachowaniem UINavigationController
podczas tworzenia przycisku Wstecz podczas operacji wypychania jest użycie tytułu z poprzedniego kontrolera.
Tytuł przycisku wstecz jest domyślnie tytułem poprzedniego widoku, więc szybką sztuczką, której używam, jest umieszczenie następującego kodu w pliku .m poprzedniego widoku.
-(void)viewWillAppear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Back";
}
w swojej metodzie init dodaj następujący kod:
- (id)initWithStyle:(UITableViewStyle)style {
if(self = [super init]) {
//...
UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
style:UIBarButtonItemStylePlain
target:self
action:@selector(goBack)];
self.navigationItem.leftBarButtonItem = customBackButton;
[customBackButton release];
//...
}
return self;
}
następnie dodaj prostą metodę, aby umożliwić odrzucenie kontrolera widoku:
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
Dodaj następujący kod w viewDidLoad lub loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
Przetestowałem to na iPhonie i iPadzie z iOS 9
navigationController
i topItem
, np .:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Dodając do odpowiedzi wodzy. Uwaga z dokumentacji firmy Apple, że deklaracja backBarButtonItem jest taka:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Dlatego odpowiedź Reina spowoduje wyciek pamięci, ponieważ zsyntetyzowany ustawiacz przekaże retain
instancję, która ją przekaże, która nigdy nie jest jawnie udostępniana. Możesz temu zaradzić, używającautorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
Możesz też wskazać zmienną na instancję, aby móc ją jawnie zwolnić później:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
Mam nadzieję że to pomoże!
Odkryłem coś interesującego. Jeśli podklasujesz UINavigationController
i nadpisujesz pushViewController:animated:
metodę i robisz coś takiego: (pamiętaj, że używam ARC)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target: nil action: nil];
viewController.navigationItem.backBarButtonItem = backButton;
[super pushViewController:viewController animated:animated];
Następnie dla wszystkich, ViewControllers
które są naciskane za pomocą kontrolera nawigacyjnego, przycisk „Wstecz” będzie w nich automatycznie. Jeśli chcesz zmienić tekst dla niektórych kontrolerów widoku, możesz spróbować rzutować kontroler widoku na określoną klasę lub swój własny niestandardowy protokół (z którego dziedziczy kontroler widoku, który może mieć metodę taką jakbackButtonText
lub coś podobnego), co może dać ci pewne informacje o kontrolerze widoku, które się pojawiają, aby można było dostosować do niego tekst przycisku Wstecz. Teraz tekst przycisku Wstecz jest obsługiwany w miejscu, za które ponosi wyłączną odpowiedzialność. Muszę przyznać, że tworzenie nowego przycisku do zmiany tekstu jest do bani, ale cóż.
Czy ktoś może wymyślić powód, dla którego nie miałby tego robić w ten sposób? Przynajmniej nie musisz majstrować przy tytułach kontrolera widoku ani pamiętać o utworzeniu nowego przycisku Wstecz przed naciśnięciem kontrolera widoku na kontrolerze nawigacyjnym.
odpowiedź wodzy działa dobrze.
Zwróć uwagę, że jeśli naciśniesz więcej niż jeden kontroler widoku, zmieniony tytuł przycisku wstecz pojawi się dla każdego z nich, co może nie być tym, czego chcesz.
W takim przypadku musisz utworzyć niestandardowy UIBarButtonItem za każdym razem, gdy wypychasz kontroler widoku.
Upewnij się również, że zrobiłeś to przed naciśnięciem kontrolera widoku, w przeciwnym razie pojawi się czkawka na ekranie, gdy zmieni się tytuł.
Rozwijając sugestię Aubrey, możesz to zrobić w kontrolerze widoku dziecka:
utwórz dwie zmienne do przechowywania starych wartości navigationItem.title elementu nadrzędnego i navigationItem elementu nadrzędnego
UINavigationItem* oldItem;
NSString* oldTitle;
w viewDidLoad
, dodaj następujące informacje:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
w viewWillDisappear
, dodaj następujące informacje:
[oldItem setTitle: oldTitle];
oldTitle = nil; // do this if you have retained oldTitle
oldItem = nil; // do this if you have retained oldItem
To nie jest idealne. Zobaczysz, że tytuł widoku nadrzędnego zmienia się w miarę animacji nowego kontrolera. ALE pozwala to na niestandardowe oznaczenie przycisku Wstecz i utrzymanie go w kształcie standardowego przycisku Wstecz.
Włóż to w siebie viewDidLoad
, miej nadzieję, że zaowocuje to, czego szukasz
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
jeśli chcesz ustawić tytuł w kontrolerze ARRIVING (czasem więcej logiki ...) w swift 3 zrób:
func setBackButtonNavBar(title: String, delay: Double){
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in
if let navBar = self.navigationController?.navigationBar{
navBar.backItem?.title = title
}
})
}
w nadchodzącym kontrolerze:
override func viewDidLoad() {
super.viewDidLoad()
self.setBackButtonNavBar(title: "back", delay: 0.3)
}
zwykle umieszczam self.setBackButtonNavBar w rozszerzeniu kontrolera.
Wiem, że to stare pytanie, a odpowiedzi są nieco zaktualizowane!
Prostym sposobem jest zrobienie tego w nadrzędnym ViewController:
czyli ten, który przeniesie Cię do następnego kontrolera widoku.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Robiąc to w kodzie, usuń styl przycisku Wstecz pliku UINavigationConroller
. Jeśli dodasz element nawigacji w każdym ze swoich widoków, możesz ustawić tytuł tylnego przycisku w StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";