web-dev-qa-db-fra.com

Ajouter une barre de navigation à une vue sans contrôleur de navigation

J'ai un menu latéral qui se glisse pour afficher une vue sous forme de tableau. De là, j'ai des séquences qui utilisent le contrôleur de vue d'affichage. Le segue doit se connecter directement au contrôleur de vue; Je ne peux pas utiliser un contrôleur de navigation.

Comment ajouter une barre de navigation avec un élément de bouton sans contrôleur de navigation?

the story board has the navigation item

the app does not

19
user3381665

Bien qu'il existe plusieurs façons intelligentes de répondre à votre question. Je viens de le résoudre par programme et d'écrire le code suivant dans ma viewWillAppear (note - viewDidLoad est également correct, mais pas suggéré) -

- (void) viewWillAppear: (BOOL) animé {

 UINavigationBar * myNav = [[UINavigationBar alloc] initWithFrame: CGRectMake (0, 0, 320, 50)]; 
 [Apparence de la barre UINavigation] .barTintColor = [UIColor lightGrayColor]; 
 [auto.view addSubview: myNav]; 


 UIBarButtonItem * cancelItem = [[UIBarButtonItem alloc] initWithTitle: @ "Annuler" 
 style: UIBarButtonItemStyleBordered 
 cible: auto 
 action: nul]; 

 UIBarButtonItem * doneItem = [[UIBarButtonItem alloc] initWithTitle: @ "Done" 
 style: UIBarButtonItemStyleBordered 
 cible: auto-action: nil]; 


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

 [Apparence de UIBarButtonItem] .tintColor = [UIColor blueColor]; 
} 

Vous avez donc une barre de navigation blanche avec des éléments de bouton de barre bleue sans contrôleur de navigation. Encore une fois, il existe d'autres moyens de le mettre en œuvre dans votre cas. J'espère que c'était utile.

Sortie -

enter image description here

Mettre à jour -

Pour ajouter des images -

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

Il existe un moyen d'utiliser le générateur NavigationItem dans l'interface pour cela.

Ajoutez d’abord une NavigationItem à votre ViewController dans le générateur d’interface, comme vous le feriez avec une NavigationController. Assurez-vous que la variable NavigationBar soit visible en sélectionnant un élément autre que Inferred et None sous mesures simulées.

Deuxièmement, dans viewDidLoad, ajoutez simplement les lignes suivantes:

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

En ce qui concerne frame, width sera identique à votre ViewController et height sera soit 44.0, soit 64.0, selon que status bar sera visible ou non.

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

Et si vous souhaitez soutenir des orientations différentes utilisez 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],
                             ]];
5
Aerows

Swift 4 Version

 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]
2
Vitaly

soyez très prudent en ajoutant "viewWillAppear", car cette méthode peut être appelée plusieurs fois (par exemple si un modal apparaît ....), utilisez donc une approche paresseuse:

1) déclarer un var:

var myNav: UINavigationBar?

2) test si déjà défini:

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

3) assurez-vous de supprimer le contrôleur existant, par exemple sur didDisappear ...

note .. n'est pas correct pour spécifier la taille .. si iOS tourne, cela ne fonctionne pas bien ..

1
ingconti

soyez très prudent en ajoutant "viewWillAppear", car cette méthode peut être appelée plusieurs fois (par exemple si un modal apparaît ....), utilisez donc une approche paresseuse:

1) déclarer un var:

var myNav: UINavigationBar?

2) test si déjà défini:

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

3) assurez-vous de supprimer le contrôleur existant, par exemple sur didDisappear ...

1
ingconti