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?
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 -
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];
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],
]];
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]
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 ..
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 ...