Wie verstecke ich die Schaltfläche "Zurück" in UINavigationController?

158

Wissen Sie, wie Sie die Schaltfläche "Zurück" in einem UINavigationController ausblenden können? Auch, wie man es zurück zeigt, aber ich denke, das ist dem Verstecken sehr ähnlich ...

Genau wie die E-Mail-Anwendung auf dem iPhone, wenn Sie beim Anzeigen von E-Mails auf "Bearbeiten" klicken.

Zoran Simic
quelle

Antworten:

313

Ich habe gerade die Antwort herausgefunden, in einem Controller verwenden Sie diese:

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

Und um es wiederherzustellen:

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

- -

[AKTUALISIEREN]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)
Zoran Simic
quelle
18
Lernen Sie auch aus meinem Fehler: Sie müssen aufrufen, setHidesBackButton:bevor Sie das Navigationselement in den Navigationscontroller schieben.
CodingFriend1
warum vorher? Was ist, wenn Sie einen viewController drücken und dann die Zurück-Schaltfläche ausblenden möchten, um zu verhindern, dass der Benutzer zurückkehrt?
user4951
1
@codingFriend - Ich finde, dass dies auch funktioniert, wenn Sie den setHidesBackButton in den viewDidAppear-Nachrichtenhandler der Ansicht einfügen, in der Sie den Backbutton nicht anzeigen möchten.
Anon
2
Die besten Ereignisse dafür sind viewWillAppear:animated, es auszublenden und viewWillDisappear:animatedwiederherzustellen.
Pechar
Endlich etwas, das Apple in Xcode nicht geändert hat. Mehr als 5 Jahre später funktioniert diese Antwort immer noch hervorragend.
App Dev Guy
27

Fügen Sie diesen Code hinzu

[self.navigationItem setHidesBackButton:YES];
visakh7
quelle
22

Vergessen Sie nicht, dass der Benutzer nicht nur die Zurück-Schaltfläche entfernt (mit den bereits empfohlenen Methoden), sondern auch mit einer Wischgeste von links nach rechts in iOS 7 und höher zum vorherigen Bildschirm zurückkehren kann.

Um dies zu deaktivieren (falls zutreffend), implementieren Sie Folgendes (z. B. in viewDidLoad):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;
mattv123
quelle
1
Matt - +1 für Sie. Vielen Dank für das Hinzufügen dieser Notiz. Sehr hilfreich. Wenn Sie sich fragen, wie die Pop-Geste funktioniert, wischen Sie einfach in Ihrer Navigationsleiste von links nach rechts, um das zu erstellen, was Matt hier beschreibt. Das Hinzufügen des obigen Codes verhindert, dass der Benutzer dies auf dem View Controller tut, auf dem er enthalten ist.
Noobzilla
18

Nur um vorhandene Antworten zu klären: Die hidesBackButtonEigenschaft ist die richtige Antwort, aber in vielen Antworten ist nicht klar, worauf sie sich selfbezieht. Grundsätzlich sollten Sie self.navigationItem.hidesBackButton = YESim View Controller festlegen , dass der Push (oder nur Push) auf den UINavigationController.

Mit anderen Worten, sagen wir, ich habe einen UINavigationControllerNamen myNavController. Ich möchte eine neue Ansicht darauf setzen, und wenn ich das tue, möchte ich nicht mehr, dass die Schaltfläche "Zurück" angezeigt wird. Ich könnte so etwas machen wie:

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

Wenn der Code beendet ist, sollte die von gesteuerte Ansicht newVCjetzt angezeigt werden und es sollte keine Schaltfläche "Zurück" sichtbar sein.

Matt
quelle
Genau das, was ich brauchte, als ich NavigationController.NavigationItem zum ersten Mal machte. Danke Matt.
Chucky
16

Zum bedingten Ausblenden und Anzeigen der Schaltfläche Zurück können Sie folgenden Code verwenden:

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

Hinweis: In einigen Fällen müssen Sie es in die viewDidAppear-Methode anstelle von viewWillAppear einfügen, z. B.: Wenn Sie das Array der nächsten Klasse in die vorherige Klasse aktualisieren und dann die Bedingung wie oben in der nächsten Klasse überprüfen.

Sandip Patel - SM
quelle
11

Swift iOS (ich habe folgendes verwendet)

// 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
Vinod Joshi
quelle
10

Sethidesbackbutton hat bei mir aus irgendeinem Grund nicht funktioniert

Ich habe diesen Weg benutzt ->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;
M.Othman
quelle
danke ..Ich hatte das gleiche Problem, bei dem setHidesBackButton: YES nicht funktioniert hat. Aber diese Lösung funktionierte für iOS 7.
Mohsinj
6

In meinem Fall hatte ich einige Probleme mit aktuellen Antworten:

  • In viewDidLoad / viewWillAppear wurde nur das Symbol "Zurück" ausgeblendet und die Zeichenfolge "Zurück" war inaktiv, aber immer noch sichtbar
  • In viewDidAppear ist die Schaltfläche "Zurück" verschwunden ... aber ich wollte nicht, dass der Benutzer sie überhaupt sieht

Die Lösung, die endlich für mich funktioniert hat, ist:

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

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

    return self;
}
micromanc3r
quelle
3

Die von Zoran Simic vorgeschlagene Lösung hat aus irgendeinem Grund bei mir nicht funktioniert.

Dieser Code hat jedoch funktioniert:

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

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

[controller release];

Natürlich müssten Sie ein NSArray nach Ihrem Geschmack manipulieren, damit es für Sie funktioniert. Hoffe das hilft jemandem :)

PowerAktar
quelle
Danke dafür! Ich habe gegen einen seltsamen Bug gekämpft und das hat den Trick gemacht. Nicht für jedermann, aber in den richtigen Fällen nützlich.
Brandon
1

In meiner UIViewController-Unterklasse habe ich folgende Methode:

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

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

Dadurch wird die Schaltfläche "Zurück" ausgeblendet und in Swift durch eine Schaltfläche "Hinzufügen" ersetzt:

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
        }
    }
}
David Weiss
quelle
0

Swift 3.

Im Allgemeinen sollten Sie die Per-ViewController-API von Apple verwenden, wie bereits auf dieser Seite beschrieben, aber manchmal müssen Sie die Schaltfläche Zurück sofort steuern.

Der folgende Code verbirgt die Schaltfläche "Zurück" und stellt sicher, dass im Bereich der ausgeblendeten Schaltflächen keine Erkennung von Tap-Kollisionen erfolgt.

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

Dadurch wird die Zurück-Taste ausgeblendet

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


navigationItem.leftBarButtonItem = backBtn
Zeeshan
quelle