Jak ukryć przycisk „wstecz” w UINavigationController?


158

Czy wiesz, jak ukryć przycisk „wstecz” w kontrolerze UINavigationController? Poza tym, jak to pokazać, ale myślę, że jest to bardzo podobne do ukrycia ...

Podobnie jak aplikacja pocztowa na iPhonie po naciśnięciu przycisku „Edytuj” podczas przeglądania wiadomości e-mail.

Odpowiedzi:


313

Właśnie znalazłem odpowiedź, w kontrolerze użyj tego:

[self.navigationItem setHidesBackButton:YES animated:YES];

I aby to przywrócić:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[AKTUALIZACJA]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

18
Naucz się również na moim błędzie: musisz zadzwonić setHidesBackButton:PRZED wepchnięciem elementu navigationItem do navigationController.
codingFriend1

dlaczego wcześniej? A co jeśli chcesz nacisnąć ViewController, a następnie ukryć przycisk Wstecz, aby uniemożliwić użytkownikowi powrót?
user4951

1
@codingFriend - Uważam, że działa to również, jeśli umieścisz setHidesBackButton w module obsługi komunikatów viewDidAppear widoku, w którym nie chcesz wyświetlać przycisku wstecznego.
Anon,

2
Najlepsze do tego wydarzenia to viewWillAppear:animatedukrycie go i viewWillDisappear:animatedprzywrócenie.
pechar

Wreszcie coś, czego Apple nie zmieniło w Xcode. Ponad 5 lat później ta odpowiedź nadal działa świetnie.
App Dev Guy


22

Oprócz usunięcia przycisku Wstecz (przy użyciu metod już zalecanych), nie zapominaj, że użytkownik może nadal „przeskakiwać” do poprzedniego ekranu, wykonując gest przesunięcia od lewej do prawej w systemie iOS 7 i nowszych.

Aby to wyłączyć (w razie potrzeby), zaimplementuj następujące (na przykład w viewDidLoad):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;

1
Matt - +1 dla Ciebie.Dzięki za dodanie tej notatki. Bardzo przydatne. Każdy, kto zastanawia się, jak działa gest pop, po prostu przesuń palcem od lewej do prawej na pasku nawigacyjnym, aby odtworzyć to, co opisuje tutaj Matt. Dodanie powyższego kodu uniemożliwia użytkownikowi zrobienie tego na kontrolerze widoku, w którym jest on zawarty.
noobzilla

18

Aby wyjaśnić istniejące odpowiedzi: hidesBackButtonwłaściwość jest właściwą odpowiedzią, ale w wielu odpowiedziach nie jest jasne, do czego się selfodnosi. Zasadniczo powinieneś ustawić self.navigationItem.hidesBackButton = YESw kontrolerze widoku, który ma zostać wepchnięty (lub po prostu został wepchnięty) na UINavigationController.

Innymi słowy, powiedz, że mam UINavigationControllerimiona myNavController. Chcę dodać do niego nowy widok, a kiedy to zrobię, nie chcę, aby przycisk Wstecz był już wyświetlany. Mógłbym zrobić coś takiego:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

Po zakończeniu działania kodu newVCpowinien być teraz wyświetlany widok kontrolowany przez , a przycisk Wstecz nie powinien być widoczny.


Dokładnie to, czego potrzebowałem, ponieważ po raz pierwszy robiłem NavigationController.NavigationItem. Dzięki Matt.
Chucky,

16

Aby warunkowo ukryć i wyświetlić przycisk Wstecz, możesz użyć następującego kodu:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

Uwaga: w niektórych przypadkach musisz umieścić to w metodzie viewDidAppear zamiast viewWillAppear w takich przypadkach jak: kiedy aktualizujesz tablicę następnej klasy do poprzedniej klasy, a następnie sprawdzasz warunek w następnej klasie jak wyżej.


11

Swift iOS (użyłem następujących)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing

10

sethidesbackbutton z jakiegoś powodu nie działał

Użyłem w ten sposób ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;

dzięki .. Miałem ten sam problem, w którym setHidesBackButton: YES nie działał. ale to rozwiązanie działało na iOS 7.
mohsinj


6

W moim przypadku miałem kilka problemów z aktualnymi odpowiedziami:

  • inside viewDidLoad / viewWillAppear only back ikona została ukryta, a ciąg „Back” był nieaktywny, ale nadal widoczny
  • Widok wewnętrzny: Wyglądało na to, że przycisk Wstecz zniknął ... ale nie chciałem, aby użytkownik w ogóle go widział

Więc rozwiązanie, które w końcu zadziałało, to:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}

3

Rozwiązanie zaproponowane przez Zorana Simica z jakiegoś powodu nie zadziałało.

Ten kod zadziałał jednak:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

Oczywiście musiałbyś manipulować NSArray według własnego gustu, aby działał dla Ciebie. Mam nadzieję, że to komuś pomoże :)


Dzięki za to! Walczyłem z dziwnym błędem i to załatwiło sprawę. Nie dla każdego, ale przydatne we właściwych przypadkach.
Brandon,

1

W mojej podklasie UIViewController mam tę metodę:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated: animated];

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}

0

Spowoduje to ukrycie przycisku Wstecz i zastąpienie go przyciskiem Dodaj w Swift:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}

0

Szybki 3.

Ogólnie rzecz biorąc, powinieneś używać interfejsu API per-ViewController firmy Apple, jak opisano wiele razy na tej stronie, ale czasami potrzebujesz natychmiastowej kontroli przycisku Wstecz.

Poniższy kod ukrywa przycisk Wstecz i zapewnia, że ​​wykrywanie kolizji dotknięcia nie występuje w ukrytym obszarze przycisków.

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)

0

To ukrywa przycisk Wstecz

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


navigationItem.leftBarButtonItem = backBtn
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.