Come aggiungere un pulsante destro a un UINavigationController?


191

Sto cercando di aggiungere un pulsante di aggiornamento alla barra superiore di un controller di navigazione senza successo.

Ecco l'intestazione:

@interface PropertyViewController : UINavigationController {

}

Ecco come sto cercando di aggiungerlo:

- (id)initWithNibName:(NSString *)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;
}

Risposte:


362

Prova a farlo in viewDidLoad. Generalmente dovresti rimandare tutto ciò che puoi fino a quel momento, quando viene attivato un UIViewController, potrebbe essere ancora un po 'di tempo prima che venga visualizzato, inutile fare lavoro in anticipo e legare la memoria.

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  // exclude the following in ARC projects...
  [anotherButton release];
}

Per quanto riguarda il motivo per cui attualmente non funziona, non posso dire con certezza al 100% senza vedere più codice, ma succedono molte cose tra init e il caricamento della vista e potresti fare qualcosa che causa il reset di NavigationItem fra.


45
Se lo stai facendo al di fuori della sottoclasse UINavigationController, ti riferiresti ad esso in questo modo: someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver

2
Stavo implementando la soluzione suggerita e la mia app continuava a bloccarsi fino a quando non ho capito che il nome del metodo @selector deve finire in due punti (:).
Stealth

10
Anche all'interno del metodo ViewDidLoad di un UINavigationContoller, ho dovuto chiamarlo comeself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph

Grazie! @Joseph, il tuo chiarimento mi ha salvato. (y) :)
Prasanna

38

Prova ad aggiungere il pulsante all'elemento di navigazione del controller di visualizzazione che verrà inserito su questo PropertyViewController classe che hai creato.

Questo è:

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

Ora, questo infoButton creato a livello di codice verrà visualizzato nella barra di navigazione. L'idea è che il controller di navigazione raccoglie le informazioni di visualizzazione (titolo, pulsanti, ecc.) Da quelle UIViewControllerche sta per visualizzare. In realtà non si aggiungono pulsanti e simili direttamente a UINavigationController.


2
L'impostazione di rightBarButtonItem direttamente su UINavigationController non ha funzionato per me (come proposto da Louis Gerbarg sopra). Invece, imposta l'elemento direttamente su UIViewController a portata di mano come Adem suggerisce di aver funzionato!
leviatano,

4
+1 per "Prova ad aggiungere il pulsante all'elemento di navigazione del controller di visualizzazione che verrà premuto" !
Kjuly

25

Sembra che alcune persone (come me) possano venire qui alla ricerca di come aggiungere un pulsante della barra di navigazione in Interface Builder. La risposta di seguito mostra come farlo.

Aggiungi un controller di navigazione allo storyboard

Seleziona il tuo controller di visualizzazione e quindi nel menu Xcode scegli Editor> Incorpora in> Controller di navigazione .

inserisci qui la descrizione dell'immagine

In alternativa, è possibile aggiungere un UINavigationBardalla Libreria oggetti.

Aggiungi un elemento pulsante a barra

Trascina a UIBarButtonItemdalla Libreria oggetti alla barra di navigazione superiore.

inserisci qui la descrizione dell'immagine

Dovrebbe sembrare come questo:

inserisci qui la descrizione dell'immagine

Imposta gli attributi

È possibile fare doppio clic su "Elemento" per modificare il testo in qualcosa come "Aggiorna", ma è possibile utilizzare un'icona effettiva per Aggiorna . Basta selezionare la finestra di ispezione degli attributi per UIBarButtonIteme per l' elemento di sistema scegliere Aggiorna .

inserisci qui la descrizione dell'immagine

Questo ti darà l'icona di aggiornamento predefinita.

inserisci qui la descrizione dell'immagine

Aggiungi un'azione IB

Controlla il trascinamento dal UIBarButtonItemal View Controller per aggiungere un @IBAction.

class ViewController: UIViewController {

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

Questo è tutto.


Scusa, non riesco proprio a seguire ciò di cui stai parlando. Prova a fare una nuova domanda con un'immagine che illustri di cosa stai parlando. Quindi aggiungi un link qui.
Suragch

@Suragch, come posso fare le stesse cose con i file xib invece che con gli storyboard? , grazie
Cristian Chaparro A.

@CristianChaparroA. Di solito i file xib sono per viste singole e la barra di navigazione (che ospita gli elementi del pulsante barra) è per più viste. Non ho mai usato un xib con elementi di pulsanti a barra. Potresti provare a fare una nuova domanda e quindi collegarti qui.
Suragch,

14

C'è un pulsante di sistema predefinito per "Aggiorna":

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] 
                            initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                            target:self action:@selector(refreshClicked:)] autorelease];
    self.navigationItem.rightBarButtonItem = refreshButton;

}

- (IBAction)refreshClicked:(id)sender {

}

11

Puoi usare questo:

Objective-C

UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];          
self.navigationItem.rightBarButtonItem = rightSideOptionButton;

veloce

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton

6
-(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];

}

Qualcuno può dirmi che c'è qualcosa di male nel farlo in ViewWillAppear invece di ViewDidLoad
Niranjan Molkeri

6

Per 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

Consiglierei di usare il nuovo selettore swift2: #selector (classname.functionname)
Emptyless

5

Ecco la soluzione in Swift (impostare le opzioni in base alle esigenze):

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

4

Perché sei sottoclassi UINavigationController ? Non è necessario sottoclassarlo se è sufficiente aggiungere un pulsante.

Imposta una gerarchia con a UINavigationControllernella parte superiore, quindi nel viewDidLoad:metodo del controller della vista principale : imposta il pulsante e collegalo all'elemento di navigazione chiamando

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
Questa è una buona domanda Quello che sto cercando di fare è in realtà un modello di progettazione molto comune, che è un controller di scheda di base con un controller di navigazione per ogni scheda. Se esiste un modo migliore, sono aperto a suggerimenti. Forse dovrei fare anche quella domanda.
Artilheiro,


3

Swift 4:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "tap me", style: .plain, target: self, action: #selector(onButtonTap))
}

@objc func onButtonTap() {
    print("you tapped me !?")
}

Usa semplicemente navigationItem.rightBarButtonItem se vuoi il pulsante laterale destro
Ghanshyam Bagul

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

2

Prova questo. Funziona per me.

Barra di navigazione e aggiunta immagine di sfondo al pulsante destro.

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

0
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;

0
- (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");  
}

0
    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];
}

0

Devi aggiungere il tuo barButtonItem nel - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedmetodo.


0

Basta copiare e incollare questo codice 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
}

Sto cercando di aiutare
Vivek,

0

Questo problema può verificarsi se eliminiamo il controller di visualizzazione o proviamo ad aggiungere un nuovo controller di visualizzazione all'interno del builder di interfaccia (main.storyboard). Per risolvere questo problema, è necessario aggiungere "Elemento di navigazione" nel nuovo controller di visualizzazione. A volte succede che creiamo una nuova schermata del controller di visualizzazione e non si connette automaticamente a "Elemento di navigazione".

  1. Vai alla main.storyboard.
  2. Seleziona quella nuova vista Controller.
  3. Vai alla struttura del documento.
  4. Controlla visualizzare i contenuti del controller.
  5. Se il nuovo controller di visualizzazione non dispone di un elemento di navigazione, copia l'elemento di navigazione dal precedente controller di visualizzazione e incollalo nel nuovo controller di visualizzazione.
  6. salva e pulisci il progetto.

0

Inoltre puoi aggiungere più pulsanti usando rightBarButtonItems

-(void)viewDidLoad{

    UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD1:)];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD2:)];

    self.navigationItem.rightBarButtonItems = @[button1, button2];
}

-1

@Artilheiro: se si tratta di un progetto basato sulla navigazione, è possibile creare BaseViewController. Tutte le altre visualizzazioni erediteranno questo BaseView. In BaseView è possibile definire metodi generici per aggiungere il pulsante destro o per modificare il testo del pulsante sinistro.

ex:

@interface BaseController: UIViewController {

} - (void) setBackButtonCaption: (NSString *) caption;

(void) setRightButtonCaption: (NSString *) didascalia selectot: selettore (SEL);

@end // In BaseView.M

(void) setBackButtonCaption: (NSString *) caption {

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];

backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

} - (void) setRightButtonCaption: (NSString *) didascalia selectot: selettore (SEL) {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

E ora in qualsiasi vista personalizzata, implementa questa vista di base chiama i metodi:

@interface LoginView: BaseController {

In alcuni metodi chiama il metodo base come:

SEL sel = @selector (switchToForgotPIN);

[super setRightButtonCaption: @ selot "PIN dimenticato": sel];

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.