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?

jansma
źródło
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
skieruj tę odpowiedź stackoverflow.com/a/48801613/3976183
Lalit Kumar
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.

Nimit Parekh
źródło
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 = " "
Mahesh Babu
źródło
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)
Karthickkck
źródło
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)}
Pravin Kamble
źródło
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)
Vivek
źródło
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

oscar castellon
źródło
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 = " "
Anit Kumar
źródło
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.

Connor Neville
źródło
6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

użył tej linii kodu w swift 3.0

Kiran jadhav
źródło
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

Harry Bloom
źródło
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"
pteofil
źródło
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)
Ahmed Safadi
źródło
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.

Harry Bloom
źródło
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"
}
Mayur Shinde
źródło
2

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
Abhishek Jain
źródło
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)
Md. Ibrahim Hassan
źródło
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()
Giorgio
źródło
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).

Saeed Ir
źródło
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
    }
}
Nikita Teplyakov
źródło
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
SoftDesigner
źródło
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.

Wasilij Avilov
źródło
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)
}
reza_khalafi
źródło
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)
    }
}}
Talha Ahmad Khan
źródło
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()
    }
}
IXI
źródło
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)
veradiego31
źródło
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()
Md Rais
źródło
0

za szybkie 4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
Sargis
źródło
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
  }

}
Ashish
źródło
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)
    }
Channu
źródło
0

w viewDidLoad()

    let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil)
    navigationItem.backBarButtonItem = backBarButtonItem
Yura
źródło