Domanda

Sto tentando 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;
}
È stato utile?

Soluzione

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 al momento 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 la navigazione per reimpostare tra.

Altri suggerimenti

Prova ad aggiungere il pulsante per navigationItem del controller di visualizzazione che verrà inserito in questa classe PropertyViewController che hai creato.

Cioè:

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 che è stato creato a livello di codice apparirà nella barra di navigazione. L'idea è che il controller di navigazione raccoglie le informazioni di visualizzazione (titolo, pulsanti, ecc.) Dal UIViewController che sta per visualizzare. In realtà non si aggiungono pulsanti e simili direttamente a UINavigationController .

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, puoi aggiungere un UINavigationBar dalla libreria di oggetti.

Aggiungi un elemento pulsante barra

Trascina un UIBarButtonItem dalla libreria degli oggetti nella barra di navigazione superiore.

 inserisci qui la descrizione dell'immagine

Dovrebbe apparire così:

 inserisci qui la descrizione dell'immagine

Imposta gli attributi

Puoi fare doppio clic su " Item " per cambiare il testo in qualcosa di simile a " Aggiorna " ;, ma esiste un'icona reale per Aggiorna che puoi usare. Basta selezionare la finestra di ispezione degli attributi per UIBarButtonItem e per 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 da UIBarButtonItem al View Controller per aggiungere un @IBAction .

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {

        print("How refreshing!")
    }

}

Questo è tutto.

Esiste 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 {

}

Puoi usare questo:

Objective-C

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

Swift

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
-(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];

}

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

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

Perché sei una sottoclasse UINavigationController ? Non è necessario sottoclassarlo se tutto ciò che devi fare è aggiungere un pulsante.

Imposta una gerarchia con un UINavigationController nella parte superiore, quindi nel metodo viewDidLoad: del controller della vista radice: imposta il pulsante e collegalo all'elemento di navigazione chiamando

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

Puoi provare

self.navigationBar.topItem.rightBarButtonItem = anotherButton;

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 !?")
}
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];

Prova questo. Funziona per me.

Barra di navigazione e aggiunta anche l'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;

Usa questo codice per la barra di navigazione del pulsante destro con il titolo vinto e chiama un metodo dopo aver fatto clic sul pulsante destro.

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

Dovresti aggiungere il tuo barButtonItem in - (void) pushViewController: (UIViewController *) viewController animato: (BOOL) animato metodo

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
}

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 " all'interno del nuovo controller di visualizzazione. A volte capita che creiamo una nuova schermata del controller di visualizzazione e non si connette a " Elemento di navigazione " automaticamente.

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

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

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

es:

  

@interface BaseController: UIViewController {

     

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

     

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

     

@end   // In BaseView.M

     

(void) setBackButtonCaption: (NSString *) didascalia   {

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

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

}   - (void) setRightButtonCaption: (NSString *) selectot didascalia: 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: @ " Hai dimenticato il PIN " selectot: SEL];

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top