Comment append un button droit à un UINavigationController?

J'essaye d'append un button d'actualisation à la barre supérieure d'un controller de navigation sans succès.

Voici l'en-tête:

@interface PropertyViewController : UINavigationController { } 

Voici comment j'essaie de l'append:

 - (id)initWithNibName:(NSSsortingng *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)]; self.navigationItem.rightBarButtonItem = anotherButton; } return self; } 

Essayez-le dans viewDidLoad. En général, vous devriez reporter tout ce que vous pouvez jusqu'à ce moment-là, quand un UIViewController est initialisé, il peut encore se passer un certain time avant qu'il ne s'affiche, inutile de travailler plus tôt et d'accaparer la memory.

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)]; self.navigationItem.rightBarButtonItem = anotherButton; [anotherButton release]; } 

Quant à savoir pourquoi cela ne fonctionne pas actuellement, je ne peux pas dire avec 100% de certitude sans voir plus de code, mais il se passe beaucoup de choses entre init et le chargement de la vue, et vous faites peut-être quelque chose qui provoque la réinitialisation de navigationItem entre.

Essayez d'append le button à l'élément de navigation du controller de vue qui va être ajouté à cette class PropertyViewController vous avez créée.

C'est:

 MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; [infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside]; vc.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:infoButton] autorelease]; PropertyViewController *navController = [[PropertyViewController alloc] initWithRootViewController:vc]; 

Maintenant, ce infoButton qui a été créé par programmation apparaîtra dans la barre de navigation. L'idée est que le controller de navigation récupère ses informations d'affichage (titre, buttons, etc.) depuis le UIViewController qu'il est sur le point d'afficher. Vous n'ajoutez pas de buttons et autres directement dans UINavigationController .

Il semble que certaines personnes (comme moi) puissent venir ici pour savoir comment append un button de barre de navigation dans Interface Builder. La réponse ci-dessous montre comment le faire.

Ajouter un controller de navigation à votre storyboard

Sélectionnez votre controller de vue puis, dans le menu Xcode, select Editeur> Intégrer dans> Contrôleur de navigation .

entrez la description de l'image ici

Vous pouvez également append un UINavigationBar partir de la bibliothèque d'objects.

Ajouter un élément de barre

Faites glisser un UIBarButtonItem de la bibliothèque d'objects vers la barre de navigation supérieure.

entrez la description de l'image ici

Ça devrait ressembler à ça:

entrez la description de l'image ici

Définir les attributes

Vous pouvez double-cliquer sur "Item" pour changer le text en quelque chose comme "Refresh", mais il y a une icône pour Refresh que vous pouvez utiliser. Sélectionnez simplement l'inspecteur d'attributes pour UIBarButtonItem et pour System Item choisissez Refresh .

entrez la description de l'image ici

Cela vous donnera l'icône Actualiser par défaut.

entrez la description de l'image ici

Ajouter une action IB

Contrôle faites glisser de UIBarButtonItem vers le controller de vue pour append un @IBAction .

 class ViewController: UIViewController { @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) { print("How refreshing!") } } 

C'est tout.

Il y a un button système par défaut pour "Actualiser":

 - (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshClicked:)] autorelease]; self.navigationItem.rightBarButtonItem = refreshButton; } - (IBAction)refreshClicked:(id)sender { } 

Vous pouvez utiliser ceci:

 UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(method:)]; self.navigationItem.rightBarButtonItem = anotherButton; 
 -(void) viewWillAppear:(BOOL)animated { UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom]; [btnRight setFrame:CGRectMake(0, 0, 30, 44)]; [btnRight setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal]; [btnRight addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *barBtnRight = [[UIBarButtonItem alloc] initWithCustomView:btnRight]; [barBtnRight setTintColor:[UIColor whiteColor]]; [[[self tabBarController] navigationItem] setRightBarButtonItem:barBtnRight]; } 

Voici la solution dans Swift (définissez les options selon vos besoins):

 var optionButton = UIBarButtonItem() optionButton.title = "Settings" //optionButton.action = something (put your action here) self.navigationItem.rightBarButtonItem = optionButton 

Pour Swift 2:

 self.title = "Your Title" var homeButton : UIBarButtonItem = UIBarButtonItem(title: "LeftButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod")) var logButton : UIBarButtonItem = UIBarButtonItem(title: "RigthButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod")) self.navigationItem.leftBarButtonItem = homeButton self.navigationItem.rightBarButtonItem = logButton 

Pourquoi êtes-vous sous-classs UINavigationController ? Il n'est pas nécessaire de le sous-classr si tout ce que vous avez à faire est d'y append un button.

Définissez une hiérarchie avec un UINavigationController en haut, puis dans la vue viewDidLoad: du controller de la vue racine: configurez le button et attachez-le à l'élément de navigation en appelant

 [[self navigationItem] setRightBarButtonItem:myBarButtonItem]; 

Vous pouvez utiliser self.navigationBar.topItem.rightBarButtonItem = anotherButton;

 UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 110, 50)]; view.backgroundColor = [UIColor clearColor]; UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeCustom]; [settingsButton setImage:[UIImage imageNamed:@"settings_icon_png.png"] forState:UIControlStateNormal]; [settingsButton addTarget:self action:@selector(logOutClicked) forControlEvents:UIControlEventTouchUpInside]; [settingsButton setFrame:CGRectMake(40,5,32,32)]; [view addSubview:settingsButton]; UIButton *filterButton = [UIButton buttonWithType:UIButtonTypeCustom]; [filterButton setImage:[UIImage imageNamed:@"filter.png"] forState:UIControlStateNormal]; [filterButton addTarget:self action:@selector(openActionSheet) forControlEvents:UIControlEventTouchUpInside]; [filterButton setFrame:CGRectMake(80,5,32,32)]; [view addSubview:filterButton]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view]; 

Essayez ceci.Il travaille pour moi.

Barre de navigation et également ajouté l'image de fond au button droit.

  UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)]; self.navigationItem.rightBarButtonItem=Savebtn; 

Utilisez ce code pour la barre de navigation du button droit avec votre titre gagné et appelez une méthode après avoir cliqué sur le button droit.

 UIBarButtonItem *btnSort=[[UIBarButtonItem alloc]initWithTitle:@"right" style:UIBarButtonItemStylePlain target:self action:@selector(sortedDataCalled)]; self.navigationItem.rightBarButtonItem=btnSort; } -(void)sortedDataCalled { NSLog(@"callBtn"); } 
  UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)]; self.navigationItem.rightBarButtonItem = rightBarButtonItem; 
 - (void)viewWillAppear:(BOOL)animated { [self setDetailViewNavigationBar]; } -(void)setDetailViewNavigationBar { self.navigationController.navigationBar.tintColor = [UIColor purpleColor]; [self setNavigationBarRightButton]; [self setNavigationBarBackButton]; } -(void)setNavigationBarBackButton// using custom button { UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@" Back " style:UIBarButtonItemStylePlain target:self action:@selector(onClickLeftButton:)]; self.navigationItem.leftBarButtonItem = leftButton; } - (void)onClickLeftButton:(id)sender { NSLog(@"onClickLeftButton"); } -(void)setNavigationBarRightButton { UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(onClickrighttButton:)]; self.navigationItem.rightBarButtonItem = anotherButton; } - (void)onClickrighttButton:(id)sender { NSLog(@"onClickrighttButton"); } 
  self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)]; } -(void)refreshData{ progressHud= [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; [progressHud setLabelText:@"拼命加载中..."]; [self loadNetwork]; } 

Vous devriez append votre barButtonItem dans - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated méthode - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated .

Il suffit de copyr et coller ce code Objective-C.

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self addRightBarButtonItem]; } - (void) addRightBarButtonItem { UIButton *btnAddContact = [UIButton buttonWithType:UIButtonTypeContactAdd]; [btnAddContact addTarget:self action:@selector(addCustomerPressed:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:btnAddContact]; self.navigationItem.rightBarButtonItem = barButton; } #pragma mark - UIButton - (IBAction)addCustomerPressed:(id)sender { // Your right button pressed event } 

@Artilheiro: Si c'est un projet basé sur la navigation, vous pouvez créer BaseViewController. Toutes les autres vues hériteront de cette BaseView. Dans BaseView, vous pouvez définir des methods generics pour append un button droit ou pour modifier le text du button gauche.

ex:

@interface BaseController: UIViewController {

} – (void) setBackButtonCaption: légende (NSSsortingng *);

(void) setRightButtonCaption: (NSSsortingng *) légende selectot: (SEL) sélecteur;

@end // Dans BaseView.M

(void) setBackButtonCaption: (NSSsortingng *) légende {

 UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init]; backButton.title= caption; self.navigationItem.backBarButtonItem = backButton; [backButton release]; 

} – (void) setRightButtonCaption: (NSSsortingng *) légende selectot: (SEL) selector {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init]; 
 rightButton.title = caption; rightButton.target= self; [rightButton setAction:selector]; self.navigationItem.rightBarButtonItem= rightButton; [rightButton release]; 

}

Et maintenant dans toute vue personnalisée, implémentez cette vue de base appelez les methods:

@interface LoginView: BaseController {

Dans certaines methods, méthode de base d'appel:

SEL sel = @selector (switchToForgotPIN);

[super setRightButtonCaption: @ "PIN oublié" selectot: sel];