2013-03-28 1 views
38

Ich verwende Xcode 4.6.1, um auf Objective-C zu codieren. Ich möchte wissen, wie kann ich die Navigationsleiste angezeigt halten, wenn ich einen modalen Übergang zwischen 2 View-Controllern erstellen, weil ich den Übergang im Storyboard mache und wenn ich die Anwendung die Navigationsleiste des zweiten View-Controller verschwindet, und Ich habe einen Knopf in dieser Bar, aber ich kann es nicht sehen.Modal segue, Navigationsleiste verschwindet

Antwort

48

Modale Übergänge übernehmen den gesamten Bildschirm, so dass alle Navigationsleisten, Symbolleisten oder Registerkarten im präsentierenden Controller verdeckt werden. Wenn Sie eine Navigationsleiste für diesen modalen Controller benötigen, müssen Sie eine spezielle hinzufügen und der neuen Navigationsleiste (oder Symbolleiste) beliebige Schaltflächen hinzufügen. Wenn Sie das nicht tun wollen, dann stellen Sie es nicht modal dar, machen Sie einen Push dazu.

+1

Ja, aber in iOS 7, wenn Sie eine Navigationsleiste auf die Ansicht auf diese Weise hinzufügen Sie erhalten keine einzige zusammengeführte Navigationsleiste und Statusleiste. Es ist besser, einen UINavigationController zu verwenden, wie unten beschrieben. – wuf810

1

Das liegt wahrscheinlich daran, dass Sie kein UINavigationController in Ihrem Modal haben. Du solltest einen verwenden (oder einfach eine Navigationsleiste zu deinem ViewController im Storyboard hinzufügen) und das modal präsentieren.

1

Sie eine Symbolleiste programmatisch -(void)viewDidLoad in indem Sie folgendermaßen vorgehen hinzufügen können, die getan Taste zu drücken und es ist getan, genau wie dieser

NSInteger tbHeight = 50; 
tb = [[UIToolbar alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height - tbHeight), self.view.frame.size.width, tbHeight)]; 
tb.translucent = YES; 
emailButton = [[UIBarButtonItem alloc] initWithTitle:@"Email Results" style:UIBarButtonItemStyleBordered target:tvController action:@selector(actionSheet:)]; 
UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(doneButtonPressed:)]; 

NSArray *barButton = [[NSArray alloc] initWithObjects:emailButton,flexibleSpace,doneButton,nil]; 
[tb setItems:barButton]; 


[self.view addSubview:tb]; 

barButton = nil; 

Sie erhalten dann eine IBAction erstellen müssen:

-(IBAction)doneButtonPressed:(id)sender { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Das sollte Ihnen geben, was Sie mit Ihrem modalen Ansichtsteuerpult wünschen.

+0

Warum wurde das verhindert? Der Code ist korrekt für das Hinzufügen einer Symbolleiste zu einem Modal View-Controller, die das OP wollte. Was fehlt mir hier? –

+0

Ich verstehe auch nicht, wie ist diese Lösung falsch? Wenn jemand, der es heruntergeregelt hat, würde es erklären ... –

+2

die Frage war über eine Navigationsleiste (obere Leiste mit Titel) keine Symbolleiste (untere Leiste) – bbjay

68

Fügen Sie einfach einen weiteren Navigation Controller zu Ihrem Modal View Controller hinzu. Folgen Sie den Schritten

  1. Wählen Sie die Modal View Controller
  2. Zum Editor menu
  3. Select Embed In
  4. Select Navigation Controller

Führen Sie die Anwendung. Jetzt sollte es perfekt funktionieren.

Hoffe das löst Ihr Problem.

+0

Danke, es hilft wirklich, wenn Sie einige VC modal mit NavigationBar und Tasten zeigen müssen (aber ich möchte es nicht im Navigationsstack mit der Zurück-Taste sehen).Einfach einbetten Ihre modale VC in Navigation und letzte wird für Benutzer versteckt – LIAL

+2

Obwohl nicht eine Idee von redundante Bildschirm (Navigation Controller) nur für einige Top-Symbolleiste zu sehen. – Centurion

+1

Weitere Informationen zum Verweis auf den viewController (rootViewController) in prepareToSeque finden Sie unter der Antwort von user3634990. – wuf810

4

Es gibt einen einfacheren Weg, dies zu tun. Wie vorherige Kommentare sagten (aber nicht alle Schritte erklären) müssen Sie Ihren gewünschten Zielansicht-Controller in einen Navigationscontroller einbetten, dann setzen Sie Ihren Zielansicht-Controller als Navigationscontroller, dann ruft der Navigationscontroller den Zielansicht-Controller auf.

Zuerst, die VC in einem NavVC einbetten. Dann müssen Sie den Code schreiben, um das Navigationsziel als Navigations-VC festzulegen.

Der Code sieht wie folgt aus:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    UINavigationController *nav = segue.destinationViewController; 
    AddTriviaVC *triv = [[AddTriviaVC alloc]init]; 
    triv = nav.viewControllers[0]; 
    triv.location = self.location; 
} 

Ich hoffe, das macht Sinn.

+3

Ist nicht die Zeile 'AddTriviaVC * triv = [[AddTriviaVC alloc] init];' ein toter Speicher? –

7

In iOS 8 gibt es eine bessere Methode.Sie können adaptive Präsentationsstile verwenden:

  1. Verwenden Sie ein "Geschenk als popover" Segue
  2. Stellen Sie Ihren Controller die UIPopoverPresentationControllerDelegate Protokoll
  3. Implementieren 2 Methoden

Objective-C zu übernehmen:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { 
    return UIModalPresentationFullScreen; 
} 

- (UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style { 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: controller.presentedViewController]; 
    return navController; 
} 

Swift:

UIPopoverPresentationControllerDelegate 
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.FullScreen 
    } 

func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { 
    var navController = UINavigationController(rootViewController: controller.presentedViewController) 
    return navController 
} 

Swift 4:

extension MyViewController: UIPopoverPresentationControllerDelegate { 
    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.fullScreen 
    } 

    func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { 
     return UINavigationController(rootViewController: controller.presentedViewController) 
    } 
} 

In für segue Verfahren vorbereiten stellen Sie den Delegierten:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if let adpostVC = segue.destinationViewController as? XXXController { 
      let popPC = adpostVC.popoverPresentationController 
      popPC?.delegate = self 
+0

Ich konnte das nicht funktionieren, ohne dem Storyboard einen Anker zu geben (vielleicht ist das ein impliziter Teil von Schritt # 1?). Aber da ich von einer Editiermenü-Option eines UITextView abschneide, macht ein Anker keinen Sinn. Gedanken? Die modale Präsentation erscheint zumindest in einigen Fällen als ein besserer Ansatz. – davew

4

swift Version:

Folgen Sie den Schritten:

  1. Embed VC in NavigationCo ntroller
  2. Aufschalten prepareForSegue()

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
        if segue.identifier == "goToYourController" { 
        let navigation: UINavigationController = segue.destinationViewController as! UINavigationController 
    
        var vc = YourViewController.init() 
        vc = navigation.viewControllers[0] as! YourViewController 
        //if you need send something to destnation View Controller 
        //vc.delegate = self 
        } 
    } 
    
7

Sie könnten die folgenden zeigen die Navigationsleiste einfach nicht: 3

Objective-C

UINavigationController alloc]initWithRootViewController:modalVC]; 

SWIFT

let modelVC = self.storyboard?.instantiateViewController(withIdentifier: "modalVC") as! ModalVC 
let navBarOnModal: UINavigationController = UINavigationController(rootViewController: modalVC) 
self.present(navBarOnModal, animated: true, completion: nil) 

Dies zeigt den Modal View Controller mit der Navigationsleiste an. Wissen über Objective-C ist begrenzt, so dass ich den Teil der Präsentation nicht geschrieben habe. Sie sollten in der Lage sein, das herauszufinden. ;)

Hoffe das hilft!

+1

Dies ist die beste Antwort. –

1

in Storyboard, sollten Sie fügen Sie einen Navigation Artikel zu Ihrem neuen Viewcontroller, fügen Sie dann Bar Knopf Artikel für Ihre done Taste