2013-03-28 2 views
38

Sto usando Xcode 4.6.1 per codificare su Objective-C. Voglio sapere come posso mantenere visualizzata la barra di navigazione quando creo un passaggio modale tra i controller di 2 View, perché sto seguendo i passi nello storyboard e quando eseguo l'applicazione scompare la barra di navigazione del secondo controller di visualizzazione, e Ho un pulsante fatto su quella barra ma non riesco a vederlo.Seguito modale, la barra di navigazione scompare

risposta

48

Le sequenze modali occupano l'intero schermo, quindi tutte le barre di navigazione, barre degli strumenti o barre delle schede presenti nel controller di presentazione saranno coperte. Se si desidera una barra di navigazione su questo controller modale, sarà necessario aggiungerne uno in particolare e aggiungere tutti i pulsanti desiderati alla nuova barra di navigazione (o barra degli strumenti). Se non vuoi farlo, non presentarlo in modo modale, fai una spinta.

+1

Si, pero 'in iOS 7 se si aggiunge una NavigationBar alla vista in questo modo non si ottiene una singola barra di navigazione e barra di stato unite. Meglio attaccare ad un UINavigationController come descritto di seguito. – wuf810

1

Ciò è probabilmente dovuto al fatto che non si dispone di un UINavigationController nel proprio modal. Dovresti usarne uno (o semplicemente aggiungere una barra di navigazione al ViewController nello Storyboard) e presentarlo modalmente.

1

È possibile aggiungere una barra degli strumenti programatically effettuando le seguenti operazioni in -(void)viewDidLoad

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; 

Sarà quindi necessario creare un IBAction per premere il pulsante di fatto e si è fatto proprio così:

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

Questo dovrebbe darti quello che vuoi con il tuo controller di visualizzazione modale.

+0

Perché questo è stato ridotto? Il codice è corretto per aggiungere una barra degli strumenti a un controller di visualizzazione modale, che è ciò che l'OP voleva. Cosa mi manca qui? –

+0

Anche io non capisco come è questa soluzione sbagliata? Se qualcuno che ha downvoted avrebbe in mente di spiegare ... –

+2

la domanda riguardava una barra di navigazione (barra in alto con titolo) non una barra degli strumenti (barra in basso) – bbjay

68

Basta aggiungere un altro Navigation Controller al controller della visualizzazione modale. Seguire la procedura

  1. Selezionare il Modal View Controller
  2. Vai Editor menu
  3. Selezionare Embed In
  4. Selezionare Navigation Controller

Eseguire l'applicazione. Ora dovrebbe funzionare perfettamente.

Spero che questo risolva il tuo problema.

+0

Grazie davvero aiuta se devi mostrare qualche VC modally con NavigationBar e pulsanti (ma non voglio vederlo nello stack di navigazione con il pulsante Indietro).Basta incorporare il tuo VC modale in Navigazione e l'ultimo sarà nascosto per gli utenti – LIAL

+2

Anche se non ti piace l'idea di avere uno schermo ridondante (Navigation Controller) solo per mostrare alcune delle migliori barre degli strumenti. – Centurion

+1

Vedere la risposta di user3634990 sotto per i dettagli su come fare riferimento a viewController (rootViewController) in prepareToSeque. – wuf810

4

C'è un modo più semplice per farlo. Come i commenti precedenti hanno detto (ma non ha spiegato tutti i passaggi) è necessario incorporare il controller di destinazione desiderato in un controller di navigazione, quindi impostare il controller di visualizzazione di destinazione come controller di navigazione, quindi il controller di navigazione chiama il controller di visualizzazione di destinazione.

Innanzitutto, incorporare il VC in un NavVC. Quindi è necessario scrivere il codice per impostare la destinazione dei successivi come Nav VC.

Il codice simile a questo:

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

Spero che questo ha un senso.

+3

Non è la riga 'AddTriviaVC * triv = [[AddTriviaVC alloc] init];' un archivio morto? –

7

In iOS 8 c'è un metodo migliore.È possibile utilizzare adattivi stili di presentazione:

  1. usare un "Presente come popover" segue
  2. Impostare il controller di adottare il protocollo UIPopoverPresentationControllerDelegate
  3. Implementare 2 metodi

Objective-C:

- (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 preparazione per il metodo segue impostato il delegato:

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

Non riuscivo a farlo funzionare senza assegnare un'ancora al seguito in Story Board (forse questa è una parte implicita del punto # 1?). Ma dal momento che sto seguendo l'opzione di un menu di editing di un UITextView un'ancora non ha davvero senso. Pensieri? La presentazione modale sembra un approccio migliore in almeno alcuni casi. – davew

4

rapida Versione:

Seguire passaggi:

  1. Embed VC in NavigationCo ntroller
  2. Override 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

Si potrebbe semplicemente effettuare le seguenti operazioni per visualizzare la barra di navigazione:

Objective-C

UINavigationController alloc]initWithRootViewController:modalVC]; 

SWIFT 3

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

Questo mostrerà il controller della vista modale con la barra di navigazione. La conoscenza dell'obiettivo C è limitata, quindi non ho scritto la parte della presentazione. Dovresti essere in grado di capirlo. ;)

Spero che questo aiuti!

+1

Questa è la migliore risposta. –

1

in storyboard, si dovrebbe aggiungere un elemento navigazione al vostro nuovo viewController, quindi aggiungere Bar Button Articolo per il pulsante Done