So verbergen Sie eine Navigationsleiste vor einem bestimmten Ansichts-Controller


71

Ich habe eine iPhone-App mit zwei Begrüßungsbildschirmen erstellt. Anschließend wird der Benutzer zur ersten Ansicht weitergeleitet. Ich habe einen UINavigationController hinzugefügt. Es funktioniert einwandfrei.

Wie entferne ich die Navigationsleiste nur für die Eröffnungsansicht?

Hauptfenster

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


self.splashScreen = [[SplashScreen alloc] 
                initWithNibName:@"SplashScreen" 
                bundle:nil];
if (self.pageController == nil) {
openingpage *page=[[openingpage alloc]initWithNibName:@"openingpage" bundle:[NSBundle mainBundle]];
    self.pageController = page;
    [page release];
}
[self.navigationController pushViewController:self.pageController animated:YES];

[window addSubview:splashScreen.view];

 [splashScreen displayScreen];
[self.window makeKeyAndVisible];

return YES;
 }

Antworten:


153

Versuchen Sie diese Methode in einem View Controller:

// swift
self.navigationController?.setNavigationBarHidden(true, animated: true)

// objective-c
[self.navigationController setNavigationBarHidden:YES animated:YES]; 

Weitere Erläuterungen:

UINavigationController hat eine Eigenschaft navigationBarHidden, mit der Sie die Navigationsleiste für den gesamten Navigationscontroller ein- und ausblenden können.

Schauen wir uns die nächste Hierarchie an:

--UINavigationController
------UIViewController1
------UIViewController2
------UIViewController3

Jeder der drei UIViewController hat dieselbe Navigationsleiste, da sie sich im UINavigationController befinden. Sie möchten beispielsweise die Leiste für den UIViewController2 ausblenden (eigentlich spielt es keine Rolle, in welchem) und dann in Ihren UIViewController2 schreiben:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];   //it hides the bar
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES]; // it shows the bar back
}

1
Während dies eine Antwort liefert, die ein angemessenes Ergebnis liefert, ist die öffnende Ansicht / der Begrüßungsbildschirm nicht Teil der Hierarchie des Navigationscontrollers und sollte sich daher nicht wirklich im Navigationscontroller befinden.
Twilson

2
Was ich möchte, ist, die Navigationsleiste nur für die erste "Eröffnungsansicht" auszublenden. Mit der obigen Option wird die gesamte Navigationsleiste der Dateien ausgeblendet, die sich auf den Controller für die erste Ansicht beziehen
Kingston

@kingston, dann zeigen Sie es wieder [self.navigationController setNavigationBarHidden:NO];in viewWillDisappear zum Beispiel :)
Beryllium

@berylliyum: Meine Eröffnungsseite ist eine Tabellenansicht .navigationController setNavigationBarHidden: NO]; in meiner "MapView" -AnsichtDidLoad konnte ich die Navigationsleiste abrufen. Wenn ich jedoch wieder zu meiner Eröffnungsansicht zurück navigiere, die die Tabellenansicht enthält, kann ich die Navigationsleiste erneut abrufen Du könntest mir dabei helfen
Kingston

4
Es gibt auch eine - (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animatedMethode, mit der die Navigationsleiste mit der Animation der Ansicht angezeigt / ausgeblendet wird. Diese Antwort führte mich dazu. Vielen Dank.
Martin Berger

23

Swift 4:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    navigationController?.setNavigationBarHidden(true, animated: true)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    navigationController?.setNavigationBarHidden(false, animated: false)
}

Können Sie Ihre Antwort näher erläutern? Nur Code zu posten ist oft nicht sehr hilfreich.
Noel Widmer

Dies ist gut, da die Navigationsleiste für die restlichen View-Controller angezeigt wird, nachdem Sie die aktuelle verlassen haben :). Vielen Dank!
CapturedTree

5

Das funktioniert bei mir:

Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: false)
}

//reappears navigation bar on next page
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: true)
}

1

Verwenden Sie den Code unter einer Zeile, um die Navigationsleiste in Swift3 und Swift4 auszublenden

navigationController?.setNavigationBarHidden(true, animated: true)

Navigationsleiste anzeigen

navigationController?.setNavigationBarHidden(false, animated: true)

1

Es ist besser, sich daran zu erinnern, ob es zuvor versteckt war:

private var navigationBarWasHidden = false

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Save if it was hidden initially
    self.navigationBarWasHidden = self.navigationController?.isNavigationBarHidden ?? false
    // Hide the Navigation Bar
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // Show the Navigation Bar
    self.navigationController?.setNavigationBarHidden(self.navigationBarWasHidden, animated: animated)
}


-2

Präsentieren Sie die Eröffnungsansicht modal oder;

  1. Fügen Sie es nicht Ihrem Navigationscontroller hinzu
  2. Präsentieren Sie es vor dem Navigationscontroller.
  3. Wenn alles geladen ist, schließen Sie die Eröffnungsansicht und zeigen Sie den Navigationscontroller (beide ohne Animation).

Ein Beispiel aus diesem Thread: Wie kann ich auf einem iPhone einen Begrüßungsbildschirm länger anzeigen?

-(void)applicationDidFinishLaunching:(UIApplication *)application {
    [window addSubview:splashView];
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
                                 toTarget:self withObject:nil];
}

-(void)getInitialData:(id)obj {
    [NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response
    [splashView removeFromSuperview];
    [window addSubview:tabBarController.view];
}

OP bedeutete nicht, wie der Begrüßungsbildschirm länger angezeigt werden soll, und bei der Frage geht es überhaupt nicht um Begrüßung.
Beryllium

@berryllium Vielleicht meinte er das nicht so, aber er sagte "eine iPhone-App mit zwei Begrüßungsbildschirmen", also bekam er Antworten zu "Begrüßungsbildschirmen". In der Frage wurde keine Benutzerinteraktion ausgedrückt.
Twilson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.