Usuwanie tekstu tytułowego iOS UIBarButtonItem


198

Chciałem usunąć tekst z przycisku „Wstecz” przycisku a UIBarButtonItem, pozostawiając tylko niebieski szewron na pasku nawigacyjnym. Pamiętaj, że rozwijam się na iOS 7. Wypróbowałem kilka metod, w tym między innymi:

To metoda obrazu, która mi się nie podobała (obraz wyglądał nie na miejscu):

UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"iOS7BackButton"] style:UIBarButtonItemStylePlain target:self action:@selector(goToPrevious:)];
self.navigationItem.leftBarButtonItem = barBtnItem;

Inną metodą, którą wypróbowałem, była ta, która po prostu nie działała (nic nie było wyświetlane):

UIBarButtonItem *barBtn = [[UIBarButtonItem alloc]init];
barBtn.title=@"";
self.navigationItem.leftBarButtonItem=barBtn;

To, co chciałem osiągnąć, to coś w rodzaju przycisków wstecz znajdujących się w aplikacji Muzyka na iOS 7, która zawierała tylko jeden szewron.

Dzięki.



Dlaczego nie weźmiesz pod uwagę swoich wymagań? I odnieś to w leftBarButtonItem.
Vishal Sharma,

Powodem, dla którego nie użyłem metody obrazu jest 1. Bardzo trudno jest uzyskać idealne zdjęcie przycisku Wstecz i 2. Wystąpi pewna forma niedopasowania obrazu i nie będzie on wyglądał naturalnie, i dlatego Zwróciłem się do StackOverflow o pomoc, jak to zrobić natywnie.
Pan Ziyue,

Odpowiedzi:


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

Następnie możesz usunąć tytuł elementu przycisku Wstecz.

Jeśli używasz Storyboard, możesz ustawić przycisk Wstecz inspektora atrybutów nawigacyjnych ze spacją.


95
W przypadku dużych tytułów występuje problem: nie są one wyśrodkowane, ale są przesunięte w prawo, tak jakby tekst przycisku Wstecz wciąż tam był
sonxurxo

11
To nie działa, jeśli użytkownik włączył opcję „Dostępność - kształty przycisków”
Mikael Bartlett

22
Myślę, że to lepsza odpowiedź:[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal];
benjamin

19
Każde rozwiązanie zawierające magiczne liczby to zły pomysł. Naciskając na autolayout, klasy wielkości, funkcje ułatwień dostępu itp. .. używanie stałych wartości, takich jak ta, musi cię ugryźć.
Michael Peterson,

3
Aby poprawić komentarz UIControlStateHighlighted
Beniamina

411

Aby ustawić tytuł przycisku Wstecz dla kontrolera widoku bez zmiany jego tytułu, użyj:

Cel C:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];

Szybki:

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

Aby to wyjaśnić, odbywa się to na kontrolerze widoku, który zobaczysz po naciśnięciu przycisku Wstecz. tzn. zamiast widzieć „<Ustawienia”, chcesz po prostu zobaczyć „<”, a następnie na SettingsViewController umieściłbyś to w swoim init. Wtedy nie pojawia się żaden problem z tytułem, który nie pokazuje się, gdy patrzysz na sam kontroler widoku.


1
Nie wiem, dlaczego druga odpowiedź jest oznaczona jako poprawna, po prostu usuwa tytuł, więc przycisk Wstecz ma „tytuł” ​​do pokazania, ale to wcale nie jest właściwe podejście! To powinna być właściwa odpowiedź.
Pach

8
Również dla każdego używającego Swift jest to navigationItem.backBarButtonItem = UIBarButtonItem (tytuł: „”, styl: .Plain, cel: zero, akcja: zero). Nie jest trudno przekonwertować z Obj-C do Swift, ale oszczędzę ci
kłopotu

15
@BenjaminPiette dzwonisz do tego na UIViewController, który zobaczysz po naciśnięciu przycisku Wstecz? Nie UIViewController, który wyświetla przycisk Wstecz.
DonnaLea

2
Cóż za eleganckie rozwiązanie! Dzięki. To po prostu nie wydawało się słuszne.
hyd00

2
to rozwiązanie działa idealnie, jeśli napiszesz ten wiersz kodu na poprzednim kontrolerze na stosie nawigacyjnym.
Bohdan Savych

128

Jeśli używasz Storyboardów, możesz przejść do Attributes InspectorViewControllera Navigation Item(kliknij Navigation Bar) i ustawić Back Buttonwłaściwość na „” (jeden znak spacji). Spowoduje to ustawienie tytułu przycisku Wstecz na jedną spację, pozostawiając widoczny szewron. Nie musisz zadzierać z kodem.

przykładowy obraz

Zauważ, że ustawi to Back Buttontytuł przycisku Wstecz, który będzie segregował do tego kontrolera widoku od tego, który został na niego wciśnięty, a nie do tego, Back Buttonktóry będzie wyświetlany w tym kontrolerze!


10
Chciałbym móc jeszcze bardziej głosować za tym: „Pamiętaj, że ustawi to tytuł przycisku Wstecz dla przycisku Wstecz, który będzie segregowany do tego kontrolera widoku z tego, który został na nim wciśnięty, a nie dla przycisku Wstecz, który będzie wyświetlany w tym Kontroler!"
Jayson Lane,

121

To działa dla mnie, aby wyświetlić tylko „tylny” szewron bez żadnego tekstu:

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

Ustaw tę właściwość w viewDidLoadkontrolerze widoku przedstawiającym pasek nawigacyjny, a on załatwi sprawę.

Uwaga: przetestowałem go tylko w systemie iOS 7, co jest objęte zakresem pytania.


33
Ma to efekt uboczny usuwania etykiety tytułu na środku paska nawigacji.
Pwner,

7
Ustaw tytuł push VC na 'viewWillAppear' z tą samą właściwością. W ten sposób nie jest usuwany.
Guto Araujo,

5
Przeniosłem ten fragment kodu do -viewDidLoadVC, że nie chcę tekstu Wstecz. Jednak później dowiedziałem się, że kiedy wybieram 2. VC z navigationControllertytułu, tekst pojawia się wkrótce potem, nie natychmiast. Myślę, że film lepiej to zilustruje, więc oto: link
Pan Ziyue

1
To nie jest najlepsza odpowiedź, proszę odnieść się do odpowiedzi andyleehao: [[wygląd UIBarButtonItem] setBackButtonTitlePositionAdjustment: UIOffsetMake (0, -60) forBarMetrics: UIBarMetricsDefault];
lmnbeyond

1
Oto poprawna odpowiedź zgodnie z dokumentacją Apple'a: „Gdy odbiornik znajduje się na stosie elementów nawigacyjnych i jest drugi od góry - innymi słowy, jego kontroler widoków zarządza widokami, do których użytkownik nawigowałby z powrotem - wartość w tej właściwości służy do przycisku Wstecz na najwyższym pasku nawigacyjnym. Jeśli wartość tej właściwości wynosi zero, system używa ciągu „Wstecz” jako tekstu przycisku Wstecz. ”
Raphael Oliveira

27

Kiedy ustawiasz tytuł przycisku, użyj @ „” zamiast @ „”.

--EDYTOWAĆ--

Czy coś się zmienia, gdy próbujesz innych ciągów? Z powodzeniem używam następującego kodu:

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:backString style:UIBarButtonItemStyleDone target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

backString to zmienna, która jest ustawiona na @ ”lub @„ Back ”, w zależności od tego, czy korzystam z iOS 7 lub niższej wersji.

Należy zauważyć, że tego kodu nie ma w kontrolerze strony, dla której chcę dostosować przycisk Wstecz. Tak naprawdę jest w kontrolerze, zanim znajdzie się na stosie nawigacyjnym.


Hmm, iOS 7 chyba tego nie zmienia. Nadal używa „Wstecz” jako tytułu. Gdybym setLeftBarButtonItem:backButtonzamiast tego wstawił, nic by tam nie było.
Pan Ziyue

1
Jeśli tak jest i nic się nie stanie, gdy ustawisz tytuł na coś innego, myślę, że będziesz musiał spróbować przenieść swój kod do nadrzędnego kontrolera widoku. Korzystam z kodu, który zamieściłem powyżej, w metodzie preparForSegue.
Kamaros

27

wprowadź opis zdjęcia tutaj

Czasami pomocne jest widzenie rzeczy w kontekście. Oto minimalny projekt, który ukrywa tekst „wstecz”, ale nadal pokazuje strzałkę.

Storyboard

wprowadź opis zdjęcia tutaj

Istnieje segment pokazu od przycisku „Pokaż drugi kontroler widoku” do drugiego kontrolera widoku.

Dodałem również element nawigacyjny do drugiego kontrolera widoku, aby miał tytuł. To jest opcjonalne. Nie wpływa na przycisk Wstecz.

Kod

FirstViewController.swift

import UIKit
class FirstViewController: UIViewController {

    @IBAction func showSecondViewControllerButtonTapped(sender: UIButton) {

        // hide the back button text
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {
    // Nothing at all needed here
}

Metoda alternatywna (tylko IB, bez kodu)

W serii ujęć wybierz element nawigacyjny dla pierwszego kontrolera widoku (nie drugiego). Po prostu wprowadź spację dla tekstu przycisku Wstecz.

wprowadź opis zdjęcia tutaj


Kluczowa koncepcja, że ​​„dla pierwszego kontrolera widoku (nie drugiego)”, podobnie jak nazwa VC, do której chcesz wrócić, więc to odpowiedzialność za nadanie tego tytułu.
buguibu

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

1
Możesz użyć backItem zamiast topItem. TopItem ukryje tytuł, a backItem ukryje tytuł przycisku wstecz.
Ravi Ojha,

2
Jest to jedyne rozwiązanie, jeśli childViewController znajduje się na głębokości 2+ w stosie dzieci NavigationController
Nathaniel Blumer

2
Spowoduje to również usunięcie tytułu poprzedniego kontrolera widoku. W większości przypadków będzie to do kitu
CalZone,

11

Na iOS7 Apple wprowadził dwie nowe właściwości do UINavigationBar, „backIndicatorTransitionMaskImage” i „backIndicatorImage”.

Po prostu dzwoniąc raz:

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"your_image"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"your_image_mask"]];

Będzie renderował niestandardowy obraz zamiast domyślnego glifu szewronowego, dziedzicząc kolor odcienia keyWindow.

A do usunięcia tytułu zasugeruję odpowiedź Kamarosa. Pamiętaj, aby wywołać ten kod na kontrolerze widoku, który wypycha nowy kontroler widoku. Usuwanie tekstu tytułowego iOS UIBarButtonItem


Aby dopasować kolor odcienia [[wygląd UINavigationBar] setTintColor: [UIColor whiteColor]];
Mazen Kasser

10

Podane odpowiedzi nie odniosły wielkiego sukcesu, ale znalazłem naprawdę prostą pracę. W swojej serii ujęć możesz kliknąć element nawigacyjny UIViewController i ustawić tekst przycisku Wstecz. Ustawiłem go w pojedynczej przestrzeni i dało mi to zachowanie, którego szukałem.wprowadź opis zdjęcia tutaj


10

To działało dla mnie w iOS10. Wywołaj to z viewDidLoad kontrolera widoku.

self.navigationController?.navigationBar.topItem?.title = ""

6

Prostym rozwiązaniem tego problemu, działającego zarówno na iOS7, jak i 6, jest ustawienie niestandardowego widoku tytułu w viewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];

    [titleLabel sizeToFit];

    self.navigationItem.titleView = titleLabel;
}

Następnie, w widoku WillAppear: możesz bezpiecznie zadzwonić

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

Ponieważ widok tytułu jest widokiem niestandardowym, nie zostanie nadpisany podczas powrotu do stosu nawigacji.


Potrzebowałem tylko drugiej części kodu, a nie pustego UILabel. I dzwoni [self.navigationItem.backBarButtonItem setTitle:@" "];w viewWillAppear ale to nie działa na poglądów prezentowanych po odwoływanie modalne widoku.
Diziet

6

Właściwie możesz to zrobić za pomocą jednej sztuczki:

Zastąp UINavigationBarklasę i dodaj następujący wiersz kodu:

- (void)layoutSubviews{
    self.backItem.title = @"";
    [super layoutSubviews];
}

Następnie zainicjuj swoją UINavigationControllerniestandardową klasą UINavigationBar .. itd.UINavigationController * navController = [[UINavigationController alloc] initWithNavigationBarClass:[CBCNavigationBar class] toolbarClass:nil];

Mam nadzieję że to pomoże


To zadziałało dla mnie. Chociaż wygląda na to, że animacja push na iOS 7 jest lekko zacinana: tytuł wydaje się robić miejsce na przycisk Wstecz, a następnie wyśrodkowuje, ponieważ nie ma go.
zekel

Tak, spróbuj użyć niestandardowego titleView zamiast bezpośrednio ustawiać navigationItem.title. Myślę, że to powinno rozwiązać twój problem.
rordulu

to rozwiązanie jest niesamowite, ponieważ jest globalne dla każdego paska nawigacji, który ma podklasę. Dzięki
Yetispapa,

5

Byłem w stanie ułożyć coś razem, korzystając z odpowiedzi DonnaLea. Oto jak rozwiązanie pojawia się w mojej podklasie UIViewController:

var backItemTitle:String?

override func viewDidLoad() {
    super.viewDidLoad()

    //store the original title
    backItemTitle = self.navigationController?.navigationBar.topItem?.title

    //remove the title for the back button
    navigationController?.navigationBar.topItem?.title = ""
}

override func willMoveToParentViewController(parent: UIViewController?) {
    super.willMoveToParentViewController(parent)
    if parent == nil {

        //restore the orignal title
        navigationController?.navigationBar.backItem?.title = backItemTitle
    }
}

Problem z oryginalną odpowiedzią polega na tym, że usuwa tytuł z kontrolera, gdy wrócisz do niego. Próba zresetowania tytułu w widoku WillDisappear jest zbyt późna w procesie przejścia; Powoduje, że tytuł przyciąga z powrotem zamiast ładnie animować. Jednak willMoveToParentViewController dzieje się wcześniej i pozwala na prawidłowe zachowanie.

Zastrzeżenie: Testowałem to tylko z normalnym push / pop UINavigationController. W innych sytuacjach mogą wystąpić dodatkowe nieoczekiwane zachowania.


4

W metodzie preparForSegue: pierwszego ViewControllera ustawiłeś tytuł tego widoku na @ "", więc po naciśnięciu następnego widoku wyświetli poprzedni tytuł ViewController, który będzie @ "".

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

Jedynym problemem jest to, że po naciśnięciu przycisku Wstecz twój poprzedni widok nie będzie miał tytułu, więc możesz dodać go ponownie w viewWillAppear:

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

Nie podoba mi się to rozwiązanie, ale działa i nie znalazłem innego sposobu.



3

Brak odpowiedzi pomógł mi. Ale sztuczka zrobiła - właśnie wyczyściłem tytuł kontrolera widoku, który naciskał (tam, gdzie zmierza przycisk Wstecz) tuż przed jego wciśnięciem.

Więc jeśli poprzedni widok nie ma tytułu, w systemie iOS 7 przycisk Wstecz będzie miał tylko strzałkę, bez tekstu.

W viewWillAppearwidoku pchającym przywróciłem oryginalny tytuł.


1
Hmm, ta sztuczka działa. Wygląda jednak na to, że słowa tam migają czasami. To niezbyt dobre obejście, ale mimo to dobre. +1
Pan Ziyue

3
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

Miałem ten sam problem i zrobiłem to w ten sposób.

--EDYTOWAĆ--

jest to rozwiązanie, gdy naprawdę chcesz usunąć tekst tytułu całego UIBarbuttonItem. Jeśli chcesz tylko usunąć tytuł pozycji przycisku paska wstecz, nie ma jednego prostego wygodnego rozwiązania. W moim przypadku, ponieważ mam tylko kilka UIBarButtonItems, które muszą wyświetlać tekst tytułu, właśnie zmieniłem tytułTextAttributes tych przycisków. Jeśli chcesz być bardziej szczegółowy, użyj poniższego kodu, który zmieni tylko przyciski paska nawigacji:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor clearColor],UITextAttributeTextColor,
                                nil];

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
                                                forState:UIControlStateNormal];

1
Działa to dla mnie, ale możesz zobaczyć tekst po ponownym naciśnięciu.
Diziet

3
@Diziet warto dodać takie same dla państwa UIControlStateHighlighted, jak również
CoderPug

2
Działa to dobrze, ale także „ukrywa” wszystkie inne przyciski, nie tylko przycisk Wstecz ... Jakieś pomysły na rozwiązanie tego problemu?
Urkman

3

To użycie podklasy navigationControllerusuwa „Wstecz”.

Używam tego, aby go usunąć na stałe za pośrednictwem aplikacji.

//.h
@interface OPCustomNavigationController : UINavigationController 

@end

//.m
@implementation OPCustomNavigationController

- (void)awakeFromNib
{
    [self backButtonUIOverride:YES];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self backButtonUIOverride:NO];

    [super pushViewController:viewController animated:animated];
}

- (void)backButtonUIOverride:(BOOL)isRoot
{
    if (!self.viewControllers.count)
        return;

    UIViewController *viewController;

    if (isRoot)
    {
        viewController = self.viewControllers.firstObject;
    }
    else
    {
        int previousIndex = self.viewControllers.count - 1;

        viewController = [self.viewControllers objectAtIndex:previousIndex];
    }

    viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@""
                                                                                       style:UIBarButtonItemStylePlain
                                                                                      target:nil
                                                                                      action:nil];
}

@end

3
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefaultPrompt];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(10.0, NSIntegerMin) forBarMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],
                                                               NSFontAttributeName:[UIFont systemFontOfSize:1]}
                                                    forState:UIControlStateNormal];

1
Dodaj wyjaśnienie do swojej odpowiedzi.
Alex,

1 robię ten sam kolor, co pasek nawigacji 2, rozmiar tekstu jest wystarczająco mały, aby nie ścisnąć tytułu
Bill Xie

Przejrzałem twoją odpowiedź, zawsze powinieneś ją poprzeć.
Alex

2

Ukryj przycisk Wstecz Tytuł paska nawigacji

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @""; // blank or any other title
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

2

Oto co robię, czyli łatwiej jest usunąć tytuł przycisku Wstecz

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar?.backItem?.title = ""
}

2

Swift 3.1 Możesz to zrobić, wdrażając metodę delegowania UINavigationController. Ukryje tylko tytuł z przyciskiem Wstecz, nadal otrzymamy obraz strzałki wstecz i domyślną funkcjonalność.

func navigationController(_ navigationController: UINavigationController, 
  willShow viewController: UIViewController, animated: Bool) {
        let item = UIBarButtonItem(title: " ", style: .plain, target: nil, 
                    action: nil)
        viewController.navigationItem.backBarButtonItem = item
    }

1

Możesz także użyć tego:

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;

[temporaryBarButtonItem release];

To działa dla mnie


1
case : <Back as <

override func viewWillAppear(animated: Bool) {
navigationController!.navigationBar.topItem!.title = ""
    }

1

Idealne rozwiązanie na całym świecie

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)

    return true
}

najskromniejsze rozwiązanie ze wszystkich ... wykorzystuje również przestrzeń jak wcześniej ... staje się po prostu przezroczysta ...
Laszlo

Usuwa tekst ze wszystkich UIBarButtonItems aplikacji
Mikel Sanchez

1

Tworzę niestandardową klasę UINavigationControlleri stosuję ją do wszystkich kontrolerów nawigacyjnych w mojej aplikacji. W tej niestandardowej UINavigationControllerklasie ustawiam UINavigationBardelegata na selfładowanie widoku.

- (void)viewDidLoad {
    self.navigationBar.delegate = self;
}

Następnie wdrażam metodę delegowania:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPushItem:(UINavigationItem *)item {

    // This will clear the title of the previous view controller
    // so the back button is always just a back chevron without a title
    if (self.viewControllers.count > 1) {
        UIViewController *previousViewController = [self.viewControllers objectAtIndex:(self.viewControllers.count - 2)];
        previousViewController.title = @"";
    }
    return YES;
}

W ten sposób po prostu przypisuję swoją klasę niestandardową do wszystkich kontrolerów nawigacyjnych i usuwa tytuł ze wszystkich przycisków wstecz. I dla jasności, zawsze ustawiam tytuł dla wszystkich moich innych kontrolerów widoku w środku, viewWillAppeardzięki czemu tytuł jest zawsze aktualizowany tuż przed pojawieniem się widoku (w przypadku, gdy jest usuwany przez takie sztuczki).


1

Działa tylko wpisanie pojedynczego miejsca dla elementu nawigacyjnego przycisku Wstecz !!


1
Jest to bardziej odpowiednie jako komentarz niż odpowiedź.
Al Lelopath,

1

Jeśli tak jak ja, używasz niestandardowego widoku zamiast UINavigationBari utkniesz z przyciskiem Wstecz, musisz wykonać trochę pracy, która wydaje się nieco zakłopotana.

[self.navigationController.navigationBar setHidden:NO];
self.navigationController.navigationBar.topItem.title = @"";
[self.navigationController.navigationBar setHidden:YES];

Wygląda na to, że jeśli nie zostanie zaprezentowany, bez względu na to, co spróbuje pokazać tytuł, oznacza to, że jest pokazywany, a następnie ukryty, zanim zostanie narysowany i rozwiązuje problem.


1
extension UIViewController{
    func hideBackButton(){
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }
}

1

Stworzyłem bardzo prostą kategorię konfiguracji zerowej, aby ukryć wszystkie tytuły przycisku Wstecz w naszej aplikacji, którą możesz sprawdzić tutaj . To pytanie już zaakceptowało odpowiedź, ale dla innych może być pomocne.

EDYTOWAĆ:

plik .h

#import <UIKit/UIKit.h>

@interface UINavigationController (HideBackTitle)
extern void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector);

@end

plik .m

#import "UINavigationController+HideBackTitle.h"
#import <objc/runtime.h>


@implementation UINavigationController (HideBackTitle)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        PJSwizzleMethod([self class],
                    @selector(pushViewController:animated:),
                    @selector(pj_pushViewController:animated:));
    });
}

- (void)pj_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    UIViewController *disappearingViewController =  self.viewControllers.lastObject;
    if (disappearingViewController) {
        disappearingViewController.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    }
    if (!disappearingViewController) {
        return [self pj_pushViewController:viewController animated:animated];
    }
    return [self pj_pushViewController:viewController animated:animated];
}



@end

void PJSwizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector)
{
    Method originalMethod = class_getInstanceMethod(cls, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);

    BOOL didAddMethod =
    class_addMethod(cls,
                originalSelector,
                method_getImplementation(swizzledMethod),
                method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {
        class_replaceMethod(cls,
                        swizzledSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.