Niestandardowy przycisk powrotu UINavigationBar bez tytułu


231

Jak dostosować przycisk cofania nawigacji w iOS 7 i nowszych bez tytułu? (tj. tylko ze strzałką)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Zastanawiam się tylko, czy mają jakieś self.backButtonItem;

LUB

coś takiego?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
                   initWithBarButtonSystemItem:UIBarButtonSystemItemBACK 
                   target:self action:@selector(back)];

3
Możesz użyć @hiroshi answer + właściwość tintColor paska nawigacyjnego, aby zrobić szewron z niestandardowym kolorem i bez żadnych tytułów
Dmitry Zhukov,

Dla tych, którzy mają pasek kart i nie chcesz tekstu przycisku Wstecz, poprawka jest następująca: w viewDidLoad () TabBarController wstawiam
Borzh

Odpowiedzi:


313

To właściwie całkiem proste, oto co robię:

Cel C

// 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)

Szybki 3

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

Umieść tę linię w kontrolerze widoku, który naciska na stos ( poprzedni kontroler widoku ). Nowo wciśnięty przycisk powrotu kontrolera widoku pokaże teraz wszystko, co wstawisz dla initWithTitle, czyli w tym przypadku pusty ciąg.


3
Użyłem tego, ale tytuł pojawia się i znika w animowany sposób?
user1010819,

7
Dzięki, Kyle! Szukałem sposobu na zmianę nazwy domyślnego przycisku Wstecz w iOS 7. Umieściłem to w moim prepareForSeguekontrolerze widoku i działało idealnie.
yiwei

1
@ user1010819 Jest to oczekiwane zachowanie, barButtonItems będzie animował i wchodził i wychodził podczas przełączania kontrolerów widoku. Co próbujesz osiągnąć
Kyle Begeman

1
@YiweiGao Nie ma problemu! Jest to kolejna z tych rzeczy, które jeśli znasz odpowiedni kod, jest całkiem prosty! Cieszę się, że to pomogło!
Kyle Begeman

3
Wydaje mi się, że to wymaga aktualizacji, po prostu nic teraz nie pokazuje, strzała domyślnie nie istnieje?
Mathijs Segers

198

Znalazłem prosty sposób na utworzenie przycisku Wstecz za pomocą pojedynczej strzałki na iOS.

Załóżmy, że masz kontroler nawigacji, który wybiera ViewA z ViewB. W IB wybierz pasek nawigacji ViewA, powinieneś zobaczyć następujące opcje: Tytuł, Monit i Przycisk Wstecz.

Widok Opcje paska nawigacji

Widok Opcje paska nawigacji

Sztuką jest wybranie tytułu przycisku Wstecz kontrolera widoku przeznaczenia (ViewB) w opcjach poprzedniego kontrolera widoku (Widok A). Jeśli nie wypełnisz opcji „Przycisk Wstecz”, iOS automatycznie umieści tytuł „Wstecz” wraz z tytułem poprzedniego kontrolera widoku. Tak więc musisz wypełnić tę opcję pojedynczym miejscem.

Wypełnij miejsce w opcji „Przycisk Wstecz”

Wypełnij miejsce w opcji „Przycisk Wstecz”

Wynik:

Wynik:


Witamy w Stack Overflow . Jeśli jeszcze tego nie zrobiłeś , zapoznaj się z naszą wycieczką i przeczytaj artykuły w centrum pomocy o tym, jak pracujemy i jakie są zwyczaje społeczności. Jeśli potrzebujesz pomocy z funkcjami witryny, nie bój się wyszukiwać, a następnie zadaj pytanie na temat Meta Stack Overflow (jeśli nadal nie możesz znaleźć odpowiedzi). Dzięki i powodzenia! W każdym razie możesz teraz opublikować swoje zdjęcia ... :)
Qantas 94 Heavy

53
to działa, po prostu zwróć uwagę - musisz ustawić „Przycisk Wstecz” dla poprzedniego kontrolera (np. dla rootViewController w kontrolerze nawigacyjnym)
evfemist

Upewnij się, że nie masz „hidesBackButton” jest ustawiony na TRUE w punkcie nawigacyjnym w ViewA
podkładki

Wydaje mi się, że działa to, jeśli tytuł kontrolera prezentującego jest wystarczająco długi - jeśli jest to krótki tytuł, zostanie użyty.
amergin

1
dla mnie to działa tylko wtedy, gdy zarówno źródłowy, jak i docelowy element nawigacyjny ViewController ma Back Buttonustawiony pojedynczy znak spacji (tj. zarówno ViewA, jak i ViewB)
dcestari

72

Po prostu użyj obrazu!

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

Ikona z powrotem

Icon-Back@2x.png

Ikona z powrotem @ 2x

Icon-Back@3x.png

Ikona z powrotem @ 23x


4
Dzięki temu rozwiązaniu wydaje się, że tracisz funkcję „przeciągnij, aby wrócić”.
j7nn7k

16
navigationController?.interactivePopGestureRecognizer?.delegate = selfrobi sztuczkę, aby zatrzymać gest machnięcia wstecz
Victor Carmouze

Szukałem tej odpowiedzi, być może przez całe życie, a mianowicie selektora akcji.
Des

29

iOS7 ma nowe reguły interfejsu, więc lepiej jest zachować przynajmniej strzałkę wstecz, kiedy naciskasz UIView. Bardzo łatwo jest programowo zmienić tekst „wstecz”. Po prostu dodaj ten kod przed wypchnięciem widoku (lub przygotujForSegue, jeśli używasz StoryBoards):

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

Spowoduje to zmianę domyślnego tekstu „Wstecz”, ale zachowa strzałkę wstecz w stylu iOS7. Możesz także zmienić kolor odcienia strzałki wstecz przed naciśnięciem widoku:

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

Mam nadzieję, że to ci pomoże!


2
Działa to naprawdę dobrze i wydaje się lepsze niż inne opcje. Na przykład tytuł nigdy nie musi być resetowany do poprzedniej wartości, w przeciwieństwie do niektórych innych odpowiedzi.
pr1001,

26

Nic więcej nie musisz robić. Możesz to samo osiągnąć poprzez samą scenorys.

Wystarczy przejść do głównego kontrolera nawigacyjnego i zwolnić miejsce. Pamiętaj nie o kontrolerze, w którym chciałeś przycisk Wstecz bez tytułu, ale do głównego kontrolera nawigacji.

Jak na obrazku poniżej.  Działa to na iOS 7 i iOS 8


Próbuję, to działa. Ale nadal nie mogę zmienić tytułu w kodzie.
Yu-Lin Wang

Pracowałem z XCode7, ale już nie działa w xCode8 -> ios10.X, użyłem metody
@iwasrobbed

Cały geniusz jest prosty!
Illya Krit,

22

Chociaż odpowiedź Kyle'a Begemana całkowicie rozwiązuje problem, dość denerwujące jest posiadanie tego kodu w każdym możliwym kontrolerze widoku. Skończyło się na prostej UINavigationItemkategorii. Uwaga, bądźcie smokami! Przepraszam, mam na myśli, 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

1
Głosowałem, ale zdecydowałem się na zastosowanie prostszego hacka zamiast tego - [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-1000, -1000) forBarMetrics:UIBarMetricsDefault]; ( źródło ) - może być nieco mniej elegancki, ale zamiatanie czułem się jak przesada
31'14

2
Poważnie wszyscy ... nie przechodźcie na inne rozwiązanie. Zaimplementuj rozwiązanie @nicky opublikowane jako kategoria i nie zastanawiaj się dwa razy. To świetne rozwiązanie wielokrotnego użytku, które można wdrożyć w całej aplikacji, jeśli dodasz ten plik Prefix.pch. Apple zachęca do korzystania z kategorii w celu dodawania metod do istniejących klas, z których należy skorzystać, jeśli to możliwe.
zmonteca,

Moim zdaniem jest to najlepsze rozwiązanie, w każdym razie „metoda_wymiana_implementacji” jest nieco niebezpieczna, spójrz na to: Właściwy sposób na zamiatanie
Alessandro Orrù

@ AlessandroOrrù W tym konkretnym przypadku powinno to być bezpieczne, ponieważ metoda swizzled jest UINavigationItemmetodą własną, nie wiąże się z nią dziedziczenie. I _cmdjest bardzo mało prawdopodobne, aby być zaangażowanym w getter. W każdym razie jest to dobra uwaga. Wszyscy więc, jeśli masz w swoim projekcie któregoś z tych licznych pomocników, zrób to tutaj.
secondcitysaint

21

EDYCJA: 2014-04-09: Gdy zyskałem reputację, jest mi przykro, ponieważ nie używam już tej sztuczki. Polecam odpowiedź Kyle'a. Zauważ również, że selfof self.navigationItem.backBarButtonItemnie jest kontrolerem widoku, przycisk powrotu jest wyświetlany, ale poprzedni kontroler widoku, do którego chcesz wrócić.

Jeśli nie potrzebujesz tekstu tytułu dla poprzedniego kontrolera widoku, po prostu wypełnij tytuł pustym łańcuchem;

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

Zapobiegnie to pokazywaniu „wstecz” za pomocą szewronu na kontrolerze widoku wypychanego.

EDYCJA: Nawet jeśli używasz niepustego tekstu tytułu, ustawianie tytułu poprzedniego kontrolera widoku viewWillAppear:działa, z wyjątkiem tego, że tytuł może migać w mgnieniu oka, gdy kontroler widoku się pojawi. Wydaje mi się, że „aplikacja twitterowa” robi bardziej subtelny hack, aby uniknąć migotania.


Jedynym problemem, jaki tutaj miałem, było to, że kiedy uderzyłem w pasek nawigacji, aby cofnąć tytuł w poprzednim widoku staje się pusty. Jakiś sposób na to?
Alioo,

@Alioo Czy próbowałeś tego, o czym wspomniałem w wierszu „EDIT”?
hiroshi

20

To działa, ale usunie tytuł poprzedniego elementu, nawet jeśli wrócisz do niego:

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

Wystarczy ustawić tę właściwość na viewDidLoadwciśniętym kontrolerze widoku.


17
Spowoduje to usunięcie tytułu poprzedniego elementu, nawet jeśli wrócisz do niego. Niezbyt dobrze :(
Antzi

Ustawiam tytuł wciskanego VC, viewWillAppearwięc zawsze jest ustawiony poprawnie.
Guto Araujo

@GutoAraujo Działa, ale tytuł pojawia się ponownie z 1 lub 2 sekundowym opóźnieniem, co sprawia, że ​​UX nie jest tak dobry.
fuiiii

W xCode8 -> ios10.X wydaje się to być jedynym sposobem na rozwiązanie tego problemu
LucioB

12

Tak to robię i najprostszy, działa i najczystszy sposób to zrobić.

Działa, jeśli jest osadzony Navigation Controller

Szybki 3

W viewDidLoaddodam to do widoku kontrolera chcesz przycisk Wstecz, aby być tylko strzałka.

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

Różnica tego w stosunku do odpowiedzi @Kyle Begemana polega na tym, że wywołujesz to na kontrolerze widoku, że chcesz, aby przycisk powrotu był tylko strzałką, a nie na kontrolerze pchania stosu.


7

Nie masz dostępu do nawigacji backButtonItem w sposób, w jaki chcesz, musisz utworzyć własny przycisk Wstecz, jak poniżej:

- (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];
}

I oczywiście:

- (void) popVC{
  [self.navigationController popViewControllerAnimated:YES];
}

potem przegraliśmy ładną animację zanikania, która miała miejsce na przycisku wstecz
Kiddo,

3
Potrzebujesz maski do płynnego przejścia. „* Jeśli chcesz użyć niestandardowego obrazu do zastąpienia domyślnego szewronu, musisz również utworzyć niestandardowy obraz maski. IOS 7 używa maski, aby wyglądać, jakby tytuł poprzedniego ekranu pojawiał się lub znikał w szewronie podczas nawigacji przejścia ”.
użytkownik

3
@ null stracisz gest machnięcia z boku na bok w iOS 7!
Mazen Kasser

@ użytkownik Mam niestandardowy obraz, ale domyślnie kolor odcienia jest niebieski. Jak mogę nie dodawać odcienia? dzięki
Mazen Kasser,

7

Cel: dostosowanie wszystkich przycisków WsteczUINavigationBardo białej ikony

Kroki: 1. w metodzie AppDelete „didFinishLaunchingWithOptions”

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. w viewDidLoadmetodzie wspólnej superklasy 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
    }

To pokazuje ostrzeżenie „Niejawna wersja SYSTEM_VESION _...” jest nieprawidłowa w C99.
Jayprakash Dubey,

7

SWIFT 4

Dla tych, którzy chcą tworzyć niestandardowe przyciski Wstecz, a także usunąć ich tytuł, użyj następującego fragmentu kodu w kontrolerze widoku, który naciska nowy:

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)

W celu bardziej uniwersalnego zastosowania wykonaj następujące czynności:

  1. Utwórz funkcję uniwersalną w następujący sposób:

    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. Następnie użyj go w kontrolerach widoku w następujący sposób:

    addCustomizedBackBtn(navigationController: self.navigationController, navigationItem: self.navigationItem)

6

Prosty hack z iOS6 działa również na iOS7:

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

Edycja: Nie używaj tego hacka. Zobacz komentarz po szczegóły.


6
Nie używaj tego hacka. W kodzie Apple na urządzeniach 64-bitowych występuje błąd, który uniemożliwia wyświetlanie widoków modalnych po przesunięciu tytułu przycisku paska. Więcej szczegółów .
zh.

Cóż, na urządzeniu były tylko problemy, a nie symulator.
zh.

Ten hack nie działa już, gdy jest zbudowany z Xcode 9 / iOS 11. „<” pojawi się zbyt nisko i zobaczysz złamane ograniczenia podczas uruchamiania w debuggerze.
T'Pol

3

możesz tego użyć. Działa to dla mnie idealnie, po prostu dodając UIButtoncustumview dla UIBarButtonItem.

Wypróbuj poniższy kod

    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;
}

3
spowoduje to jednak wyłączenie gestu przesunięcia wstecz w iOS 7
102008

3

Utwórz tytuł UILabelz żądanym tytułem dla kontrolera widoku głównego i przypisz go do kontrolera widoku navigationItem.titleView.

Teraz ustaw tytuł na pusty ciąg, a następny kontroler widoku, który naciśniesz, będzie miał przycisk Wstecz bez tekstu.

self.navigationItem.titleView = titleLabel; //Assuming you've created titleLabel above
self.title = @"";

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];

}

3

Wszystkie odpowiedzi nie rozwiązują problemu. Niedopuszczalne jest ustawianie tytułu przycisku Wstecz w każdym kontrolerze widoku, a dodanie przesunięcia do tytułu nadal powoduje przesunięcie tytułu Kontrolera widoku w prawo.

Oto metoda wykorzystująca metodę swizzling, wystarczy utworzyć nowe rozszerzenie do 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
    }
}
}

Ustaw przycisk wstecz na słowo wstecz, działa świetnie: self.navigationItem.backBarButtonItem.title = @ "Back";
Mike Zriel

Co masz na myśli kolego? Pytanie dotyczyło usunięcia tekstu z przycisku Wstecz?
jakub wolanski

1
Wiele aplikacji i własnych aplikacji Apple mówi „<Wstecz”, więc dobrze jest trzymać się standardu. BigTakeAway i JustEat.
Mike Zriel,

2

Zastosowałem następujący kod w viewDidLoad i działa:

  // 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"]]];

Tylko do aktualizacji używam Vector Icon


2

Możesz podklasować UINavigationController, ustawić się jako delegat i ustawić backBarButtonItem w metodzie delegowanej 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

2

Cofnij tytuł pusty

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

Zmień obraz z powrotem

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

1

Korzystam z tego rozwiązania od mniej więcej iOS 5 bez żadnych problemów. Zrobiłem funkcję narzędzia, którą wywołuję w moich kontrolerach widoku. Musisz to zrobić albo w viewDidLoad, albo w dowolnym późniejszym punkcie.

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;
    }
}

W niektórych przypadkach element nawigacyjny może już istnieć, w innych przypadkach należy go utworzyć. To uwzględnia oba te przypadki bez bałaganu w tytule elementu nawigacyjnego. Pozwala usunąć tytuł, po prostu przekazując go @"".


1
To jest poprawna odpowiedź. Żadnych sztuczek. Jest to po prostu użycie interfejsu API systemu iOS w sposób, w jaki miał być używany, w celu ustawienia tytułu. Ustaw na @ "", aby usunąć tytuł (przetestowany i działa poprawnie).
n13

1

Jedyny sposób, który działał dla mnie to:

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

AKTUALIZACJA:

Kiedy zmieniłem flagę animacji segue na true (wcześniej było to fałsz), jedynym sposobem, który działał dla mnie, było:

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

1

Jeśli masz dwa ViewController (FirstVC, SecondVC) Osadzone w Nawigatorze, a chcesz, aby w SecondVC była tylko strzałka wstecz.

Możesz tego spróbować w ViewDidLoad firmy FirstVC

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

Następnie, gdy wpychasz do SecondVC, zobaczysz, że jest tylko strzałka wstecz


1

Jeśli ustawisz tintColor Of NavigationBar, dodaj niestandardowy obraz przycisku Wstecz bez tytułu, aby kolor odcienia odzwierciedlał kolor obrazu. Kliknij ten link do dokumentacji Apple.

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 ];


1

Napisałem rozszerzenie, aby to ułatwić:

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
            }
        }
    }

}

1

Możesz zmienić tytuł na @ "" bieżącego ViewController na viewWillDisappear, a kiedy ma się ponownie wyświetlać, ponownie ustaw tytuł na to, co było wcześniej.

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

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

0

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.


Zobacz moją odpowiedź na prawidłowe rozwiązanie bez bałaganu w tytule elementu nawigacji.
Dima,

Czy Twoje rozwiązanie utrzymuje strzałkę wsteczną iOS7? Próbowałem czegoś podobnego, ale usunęło to strzałę.
Alejandro Figueroa

Zachowuje strzałkę wstecz w iOS 7, tak. W iOS 6 przekazanie pustego ciągu (o długości 0) spowoduje również całkowite usunięcie przycisku, więc jest to naprawdę dobre tylko dla iOS 7.
Dima

Istnieje bardzo proste rozwiązanie. Sprawdź, czy moja odpowiedź Ci odpowiada.
Guto Araujo

0

Aby dodać do powyższej odpowiedzi Thomasa C. , czasami umieszczenie pojedynczej spacji nie działa i musisz dodawać spacje.

przycisk pustego paska

Będziesz wiedział, że się udało, gdy zobaczysz „Element przycisku paska -” pod „Elementem nawigacji”. To jest w Zarysie dokumentu (Edytor-> Pokaż zarys dokumentu). Gdy zobaczysz powyższe zdjęcie, możesz usunąć kilka spacji i sprawdzić, czy nadal działa.


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; 
}

Podobnie jak Kyle Begeman, dodajesz powyższy kod do kontrolera widoku głównego. Zastosowany zostanie cały kontroler widoku pomocniczego. Dodatkowo, dodając to w metodzie initWithCoder:, możesz zastosować styl dla kontrolerów widoku głównego w podejściach opartych na Xib, Storyboard lub Code.

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.