2014-05-25 31 views
16

Ciao a tutti Nella mia app ho un menu laterale che scorre per visualizzare una vista tabella e vi sono dei segues che usano il controller della vista di rivelazione. Il seguito deve connettersi direttamente al controller della vista, altrimenti l'app si blocca in modo da non poter utilizzare un controller di navigazione. La mia domanda è come aggiungere una barra di navigazione con una voce di pulsante della barra senza un controller di navigazione. Ho fatto tutti i miei layout nella storyboard.Come aggiungere una barra di navigazione a una vista senza il controller di navigazione

the story board has the navigation item

the app does not

risposta

17

Mentre ci sono diversi modi intelligenti per rispondere alla tua domanda. Ho appena risolto a livello di codice e ho scritto il seguente codice nel mio viewWillAppear (nota - viewDidLoad è anche bene, ma non suggerito) -

 
-(void) viewWillAppear:(BOOL)animated { 

    UINavigationBar *myNav = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)]; 
    [UINavigationBar appearance].barTintColor = [UIColor lightGrayColor]; 
    [self.view addSubview:myNav]; 


    UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" 
                    style:UIBarButtonItemStyleBordered 
                    target:self 
                    action:nil]; 

    UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
                   style:UIBarButtonItemStyleBordered 
                   target:self action:nil]; 


    UINavigationItem *navigItem = [[UINavigationItem alloc] initWithTitle:@"Navigation Title"]; 
    navigItem.rightBarButtonItem = doneItem; 
    navigItem.leftBarButtonItem = cancelItem; 
    myNav.items = [NSArray arrayWithObjects: navigItem,nil]; 

    [UIBarButtonItem appearance].tintColor = [UIColor blueColor]; 
} 

Quindi, si dispone di una barra di navigazione bianca con oggetti pulsante blu bar senza un controller di navigazione . Ancora una volta, ci sono altri modi per implementarlo nel tuo caso. Spero, questo è stato utile.

uscita -

enter image description here

Aggiornamento -

per aggiungere immagini -

UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,10,32,32)]; 
[myImage setImage:[UIImage imageNamed:@"image.png"]]; 
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myImage]; 
[self.view addSubview:myImage]; 
+0

ciao, grazie per questa grande soluzione ma sai come avere un pulsante immagine dove è s Annullare piuttosto che solo il testo? – user3381665

+0

Aggiornato la mia risposta. Ehi, mi hai fatto molto codice. Sono sicuro che puoi personalizzare il tuo codice e renderlo funzionale. – raurora

+0

mi dispiace per quell'uomo, sono nuovo di questo da Android e sto solo facendo questa app IOS che il resto della mia squadra è in licenza. – user3381665

4

C'è un modo per utilizzare il NavigationItem nel costruttore di interfaccia per questo.

Prima aggiungere un NavigationItem al vostro ViewController nel costruttore di interfaccia, come si farebbe con un NavigationController. Assicurati che lo NavigationBar sia visibile selezionando qualcosa di diverso da Inferred e None sotto metriche simulate.

In secondo luogo, in viewDidLoad, basta aggiungere le seguenti righe:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame: frame]; 
    bar.items = @[self.navigationItem]; 
    [self.view addSubview: bar]; 
} 

Per quanto riguarda frame, width sarà lo stesso del vostro ViewController e height sarà o 44.0 o 64.0 a seconda se il status bar è visibile o non.

CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height; 
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, navigationBarHeight); 

E se vuoi sostenerci diversi orientamenti uso NSLayoutConstraints:

CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height; 
[self.view addConstraints: @[ 
    [NSLayoutConstraint constraintWithItem: self.view 
           attribute: NSLayoutAttributeLeft 
           relatedBy: NSLayoutRelationEqual 
            toItem: bar 
           attribute: NSLayoutAttributeLeft 
           multiplier: 1.0 
            constant: 0.0], 
    [NSLayoutConstraint constraintWithItem: self.view 
           attribute: NSLayoutAttributeRight 
           relatedBy: NSLayoutRelationEqual 
            toItem: bar 
           attribute: NSLayoutAttributeRight 
           multiplier: 1.0 
            constant: 0.0], 
    [NSLayoutConstraint constraintWithItem: self.view 
           attribute: NSLayoutAttributeTop 
           relatedBy: NSLayoutRelationEqual 
            toItem: bar 
           attribute: NSLayoutAttributeTop 
           multiplier: 1.0 
            constant: 0.0], 
    [NSLayoutConstraint constraintWithItem: bar 
           attribute: NSLayoutAttributeHeight 
           relatedBy: NSLayoutRelationEqual 
            toItem: nil 
           attribute: NSLayoutAttributeNotAnAttribute 
           multiplier: 1.0 
            constant: navigationBarHeight], 
          ]]; 
0

Swift 4 Versione

let navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: 320, height: 50)) 
    navigationBar.barTintColor = UIColor.lightGray 
    view.addSubview(navigationBar) 

    let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: nil) 
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: nil) 

    let navigationItem = UINavigationItem(title: "Title") 
    navigationItem.rightBarButtonItem = cancelButton 
    navigationItem.leftBarButtonItem = doneButton 

    navigationBar.items = [navigationItem] 
0

essere molto attenti su come aggiungere in "viewWillAppear", come questo metodo può essere chiamato più volte, (ad esempio appare una modale ....) Usa un approccio pigro:

1) dichiarare una var:

var myNav: UINavigationBar? 

2) prova se già impostata:

viewWillAppear:(BOOL)animated { 
if self.myNav != nil{ 
    return 
} 
self.myNav = .... 

3) assicurarsi rimuovi uscendo regolatore, ad esempio su didDisappear ...

0

fare molta attenzione all'aggiunta di "viewWillAppear", in quanto questo metodo può essere chiamato più volte, (ad esempio appare una modale ....) quindi utilizzare un approccio pigro:

1) dichiarare una var:

var myNav: UINavigationBar? 

2) prova se già impostata:

viewWillAppear:(BOOL)animated { 
if self.myNav != nil{ 
    return 
} 
self.myNav = .... 

3) assicurarsi controllore uscendo rimuovere, ad esempio su didDisappear ...

nota .. non è corretto per specificare la dimensione .. se iOS ruota, non funziona bene ..

Problemi correlati