Jak usunąć tytuł przycisku Wstecz na pasku nawigacyjnym


83

Kiedy wciskam UIViewController, ma jakiś tytuł w przycisku Wstecz na nowym UIViewController, jeśli tytuł ma dużo tekstu, nie wygląda dobrze w iPhone 4s, więc chcę go usunąć.

Jeśli dodam kod w prepareForSeguefunkcji, będzie to problem.

Każdy lepszy sposób na osiągnięcie tego?


Możesz także zmienić tytuł przycisku Wstecz. a aby wrócić, potrzebujesz przycisku Wstecz. więc myślę, że nie ma potrzeby usuwania przycisku Wstecz.
Ashok Londhe

prosimy o poinformowanie o rozwiązaniu problemu.
Ashok Londhe


jest fajny artykuł na ten temat sarunw.com/posts/ ...
user3672430

Odpowiedzi:


129

Jeśli chcesz strzałkę wstecz, następujący kod należy umieścić w AppDelegatepliku w didFinishLaunchingWithOptionsmetodzie.

For Objective-C

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

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

Inna opcja podana poniżej.

W Objective C

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

W Swift

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

AKTUALIZACJA :

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

ZAKTUALIZUJ SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

Korzystanie z przesunięcia

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

Więc może twój problem został rozwiązany.

Miłego kodowania.


8
setBackButtonTitlePositionAdjustmentnie zawsze działa, gdy tytuł przycisku Wstecz jest bardzo długi, ale nie jest wystarczająco długi, aby zmienić na „Wstecz”, tytuł w środku przesunie się w prawo.
zgjie

3
@zgjie to tylko kwestia tego, jak duży jest Twój offset. możesz łatwo zamienić „-60” na „-6000” i zapomnieć o tym problemie
slxl

10
Tylko trochę precyzji, tytuł należy do PREVIOUS kontrolera widoku. Pamiętaj więc, aby ustawić go tam, przed metodą presentViewController lub pushViewController.
Benjamin,

1
Hmm, to nie działa w AppDelegate. „Wartość typu AppDelegate nie ma elementu navigationItem”
Prabhu,

3
@DominikBucher Stworzyłem kategorię dla tego zachowania, która ukrywa tytuł przycisku wstecz z każdego miejsca w aplikacji, co jest trochę "NIEWŁAŚCIWE". Po prostu dodaj kategorię do swojego projektu i gotowe. Zdecydowanie nie zgadzam się z rozwiązaniem polegającym na ustawianiu pozycji, używając, setBackButtonTitlePositionAdjustment:forBarMetrics:jeśli użytkownik włączył kształt przycisku w ustawieniach dostępności, kształt pokaże się kończąc na brzydkim pasku nawigacyjnym.
Pratik Jamariya,

72

Praca w Swift 3 jest jak urok

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

1
To jedyny, który działał podczas używanianavigationController?.pushViewController(_, animated:)
D. Greg

Dzięki stary. Ten był jedynym, który zadziałał. Twoje zdrowie.
Felipe

3
Pracował dla mnie również Swift 4
christijk

1
@MaksimKniazev, jakieś rozwiązanie tego problemu? Znalazłem jedyne rozwiązanie, aby ponownie zaktualizować tytuł w viewWillAppear:.
Hemang

4
to usuwa tytuł z poprzedniego widoku
Naser Mohamed

51

Używam tej linii kodu w AppDelegatepliku do didFinishLaunchingWithOptionsmetody, aby usunąć przycisk backbutton title.

Swift 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)

17
setBackButtonTitlePositionAdjustmentnie zawsze działa, gdy tytuł przycisku Wstecz jest bardzo długi, ale nie jest wystarczająco długi, aby zmienić na „Wstecz”, tytuł w środku przesunie się w prawo.
zgjie

To nie jest idealne rozwiązanie. Jeśli ustawimy dowolny tytuł nawigacji bez zmiany tytułu elementu lewego paska nawigacyjnego, tytuł przesunie się w prawo z powodu wstawek tytułu lewego paska nawigacji.
matematyka

2
w iOS 11 jest to przełamanie pozycji przycisku Wstecz. Spada poniżej swojej pierwotnej pozycji
korgx9

Jak to ma działać? Tekst będzie nadal dostępny przez VoiceOver.
Łukasz Ciastko

Stwarza to problem, gdy anuluj lub zrobione barbuttonitem nie są widoczne podczas prezentowania imagepicker lub czegoś podobnego
Nupur Sharma

16

Wystarczy przejść do nadrzędnego kontrolera ViewController, od którego są zależne inne kontrolery ViewController.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}

16

Po prostu skopiuj ten kod didFinishLaunchingWithOptions launchOptions

Szybki 5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

Szybki 4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

12

to jest proste. wstaw spację w tytule przycisku Wstecz i gotowe. Pamiętaj, że w poprzednim widoku musi znajdować się miejsce, w którym chcesz usunąć tekst.

wprowadź opis obrazu tutaj


Najlepsze rozwiązanie IMO. Nie wymaga ustawiania całej aplikacji na określony, wyraźny styl, który może mieć efekt uboczny polegający na tym, że znikną jakiekolwiek elementy paska tekstu. Odpowiedź mogłaby być lepsza, gdyby wspomniano, że musisz przeciągnąć element navigationItem do kontrolera, jeśli go tam nie ma.
TheJeff

7

Możesz użyć Xcode 8 i Swift 3.0

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

3
Czy nie spowoduje to całkowitego usunięcia tytułu z poprzedniego kontrolera widoku?
NRitH

1
Tak, to usunie tytuł dla wszystkich ViewControllerpchniętych zself.navigationController
Yevhen Dubinin

7

Możesz utworzyć podklasę dla wszystkich, dla UIViewControllerktórych chcesz to zachowanie, oraz w podklasie viewDidLoad:

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

W ten sposób możesz wybrać kontrolery, dla których chcesz zachować zachowanie, bez duplikowania kodu. Wolę, aby moje kontrolery po prostu mówiły „Wstecz” zamiast tytułu poprzedniego kontrolera, więc ustawiłem ten tytuł tutaj.


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

użył tej linii kodu w swift 3.0


1
wpłynie na przycisk anulowania dla UISearchController
JAHelia

5

Czerpiąc inspirację z rordulu męska odpowiedź tutaj , skończyło się na tworzeniu własnego UINavigationController i bar UINavigation który wydaje się obsłużyć wszystkie przypadki tej skomplikowanej problemu.

1) Zainicjuj nowy UINavigationControllerze swoim niestandardowym UINavigationBar:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2) Ustaw backItem.titlewłaściwość paska nawigacji na pusty ciąg za każdym razem, gdy widok się rozkłada

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

Teraz za każdym razem, gdy użyjesz tej kombinacji kontrolera nawigacyjnego i paska, nigdy nie będzie miała tekstu przycisku Wstecz! 🎉

Uwaga: powinno to działać dobrze, jeśli używasz również scenorysów, po prostu upuść niestandardowy komponent paska nawigacji w widoku


Wielkie dzięki! To najlepszy sposób na zrobienie tego i powinna to być poprawna odpowiedź :)
GameDev

3
Właśnie zdałem sobie sprawę, że ma to efekt uboczny, ponieważ całkowicie wyczyści tytuł elementu nawigacyjnego. Więc kiedy pokaże się poprzedni widok, nie będzie miał tytułu! Będę szukać idealnego rozwiązania tego irytującego problemu.
Harry Bloom,

cholera, masz rację. Jak mogłem tego przegapić! Proszę, powiedz mi, czy znajdziesz rozwiązanie tego problemu. dzięki
GameDev

Czy możesz znaleźć idealne rozwiązanie @HarryBloom?
Hemang

@Hemang Nie jest to idealne rozwiązanie, ale znalazłem coś, co działa. Dodałem drugą odpowiedź tutaj stackoverflow.com/a/49094282/1532838
Harry Bloom

3

Zwykle dodaję lub zmieniam przycisk Wstecz w viewDidLoad w UIViewController.

Coś takiego powinno działać:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

Nie zapomnij zmienić i zaimplementować funkcji, którą jest wywoływana, aby zamknąć widok.

Jeszcze łatwiej, po prostu zmień tytuł:

self.navigationItem.leftBarButtonItem.title = "Back"

7
To łamie wbudowaną obsługę iOS do przesuwania palcem od lewej do prawej, aby nawigować z powrotem, oraz IMHO, aplikacje, które to psują, są naprawdę irytujące.
NRitH

2

Swift 3:

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

2

Dodanie tutaj drugiej odpowiedzi jako pierwszej działa tylko częściowo. Ta metoda jest mniej elegancka, ponieważ wymaga wywołania metody w każdym widoku aplikacji, jednak działa bez żadnych skutków ubocznych.

Najpierw utwórz klasę rozszerzenia UIViewController z funkcją usuwania tekstu przycisku Wstecz i dodawania niestandardowego przycisku Wstecz:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Po drugie, możemy po prostu wywołać tę funkcję w viewDidLoadkażdym kontrolerze widoku, w którym jest ona potrzebna.


2

Proste rozwiązanie:

Podczas wciskania drugiego kontrolera z pierwszego kontrolera, wstaw self.navigationItem.title = "" w pole viewWillDisappear pierwszego kontrolera. Ukrywa tytuł przycisku wstecz przed drugim kontrolerem.

Powyższa pozycja ukrywa tytuł pierwszego kontrolera, dlatego kiedy wróciliśmy, chcemy ponownie uzyskać tytuł pierwszego kontrolera. W tym celu dodaliśmy tytuł pierwszego kontrolera w metodzie viewWillAppear pierwszego kontrolera.

Zobacz następujące metody (pierwszego kontrolera)

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

2

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

Przycisk Cancel and Done of imagepicker zniknął z tego podejścia
Nupur Sharma

2

Zaktualizowana odpowiedź dla Swift 4.2

Praca z UIAppearanceto czystszy sposób rozwiązania problemu, ale spowodowałaby, że wszystkie UIBarButtonItemmiałyby jasny tekst. Ulepszoną wersją rozwiązania mogłoby być sprawdzenie, czy UIBarButtonItemplik znajduje się w pliku UINavigationBar.

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

2

W systemie iOS 14 backButtonDisplayModewłaściwość jest teraz obecna w UINavigationItemklasie. Tak więc, aby usunąć tytuł przycisku Wstecz, którego możesz użyć

navigationItem.backButtonDisplayMode = .minimal

w viewDidLoadfunkcji viewController, w którym chcesz go usunąć.

Aby usunąć to w całym pasku nawigacji, użyłem techniki swizzling

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}

I na application(_:didFinishLaunchingWithOptions:)telefon

UIViewController.swizzle()

1

Działa na Swift 5 :

        self.navigationItem.backBarButtonItem?.title = ""

Należy pamiętać, że będzie to skuteczne dla następnego naciśniętego kontrolera widoku, a nie dla bieżącego na wyświetlaczu, dlatego jest bardzo zagmatwany!

Sprawdź także scenorys i wybierz element nawigacyjny poprzedniego kontrolera widoku, a następnie wpisz coś w przycisku Wstecz (Inspektor).


1

Mam proste rozwiązanie dla tych, którzy nie chcą używać swizzlingu metod lub powielania podobnego kodu w różnych kontrolerach widoku.

Aby usunąć tytuł przycisku Wstecz, utwórz podklasę UINavigationController i nadpisz metodę pushViewController (_, animated :):

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

1

Metoda dla iOS13.

let backButtonAppearance = UIBarButtonItemAppearance(style: .plain)
backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.clear]

let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.backButtonAppearance = backButtonAppearance

UINavigationBar.appearance().standardAppearance = navigationBarAppearance

0

Nie wiem dlaczego, ale znalazłem problem z ukrywaniem tytułu przycisku wstecz w plusach iPhone'a, ale w urządzeniu bez plusa pokazuje się poprawnie z

leftBarButtonItem.title = ""

Więc znalazłem prosty sposób. Kolor tinta jest ustawiony na wyczyszczenie w NavigationBar elementu NavigationViewController w autoukładaniu. Może to stanowić problem, jeśli używasz ikon lub kafelków tekstowych z odcieniem. Ale w moim przypadku nie używam tego jako wszystkiego.


0

Po prostu użyj tego:

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

Wywołaj więc tę metodę w viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

0

Możesz dodać to rozszerzenie do UIViewController, a następnie wywołać tę funkcję w każdym viewDidLoad (), na przykład: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

Chciałbym podzielić się rozwiązaniem, które działa dla mnie. Ponadto można go dostosować w zależności od potrzeb i wymagań.

Uwaga: w moim przypadku używam scenorysu, aby określić CustomNavigationBar

Swift 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}

0

Działa dla Swift 4.2

Użycie linii kodu w AppDelegatepliku dodidFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)

To ukrywa tekst przycisku paska wstecznego, ale niestety nie wyśrodkowuje tytułu paska nawigacji
Giorgio

0

Swift 4.2 i 5

Zamiast bawić się odcieniem paska nawigacji, który będzie miał efekty uboczne, jeśli użyjesz selektora obrazu w dowolnym momencie później w kodzie.

Użyj poniższego kodu:

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

Wywołaj to z pierwszego ViewController:

self.awakeFromNib()

0

za szybkie 4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

0

Po prostu utwórz rozszerzenie UIViewControllerz funkcją override awakeFromNib()i utwórz UIBarButtonItemz pustym tytułem i daj navigation backBarButtonItem.

extension UIViewController {

  open override func awakeFromNib() {
    let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarBtnItem
  }

}

0

Umieść poniższy kod w dowolnym miejscu UIViewcontroller extension, aby ukryć cały UIViewcontrollertekst z tyłu

open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }

0

w viewDidLoad()

    let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarButtonItem
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.