2010-06-03 12 views

risposta

48

Basta creare due diversi UIBarButtonItem s

Uno per l'indicatore di attività e un altro per un UIBarButtonItem normale.

UIActivityIndicatorView * activityView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)]; 
[activityView sizeToFit]; 
[activityView setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)]; 
UIBarButtonItem *loadingView = [[UIBarButtonItem alloc] initWithCustomView:activityView]; 
[self.navigationItem setRightBarButtonItem:loadingView]; 
[loadingView release]; 
[activityView release]; 

UIBarButtonItem * normalButton = [[UIBarButtonItem alloc] initWithTitle...]; 
[self.navigationItem setRightBarButtonItem:normalButton]; 
[normalButton release]; 

Quando si vuole cambiare loro, proprio riassegnare il rightBarButtonItem a qualsiasi.

+0

Ho un'altra piccola domanda. Con questa implementazione come posso chiamare beginAnimation e stopAnimation su UIActivityIndicatorView? Grazie – Luca

+0

È possibile creare una proprietà per UIActivityIndicatorView. –

+0

Grazie mille – Luca

10

Ecco ciò che funziona per me:

- (void) rightItemButtonWithActivityIndicator 
{ 
    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
    [activityIndicator startAnimating]; 
    UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator]; 
    [activityIndicator release]; 
    self.navigationItem.rightBarButtonItem = activityItem; 
    [activityItem release]; 
} 
2

Ho usato una tecnica simile per aggiornare un pulsante in un UIToolbar quando un UIWebView sta caricando (in quanto non sembra essere possibile mostrare/nascondere singola barra pulsanti). In questo caso, è necessario scambiare tutti gli elementi nella UIToolbar.

@property (strong, nonatomic) IBOutlet UIBarButtonItem *refreshBarButton; 

@property (nonatomic, strong) UIActivityIndicatorView *activityView; 
@property (nonatomic, strong) UIBarButtonItem *activityBarButton; 

@property (strong, nonatomic) IBOutlet UIToolbar *toolbar; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *backBarButton; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *refreshBarButton; 
@property (strong, nonatomic) IBOutlet UIBarButtonItem *forwardBarButton; 

#pragma mark - UIWebViewDelegate 
-(void)webViewDidFinishLoad:(UIWebView *)webView{ 
    [self updateButtons]; 
} 

-(void)webViewDidStartLoad:(UIWebView *)webView{ 
    [self updateButtons]; 
} 

-(void)updateButtons{ 
    /* 
    It's not possible to show/hide bar button items so we need to do swap out the toolbar items in order to show the progress view 
    */ 

    //Initialise the activity view 
    if (self.activityBarButton == nil){ 
     self.activityView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 
     self.activityBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.activityView]; 
     self.activityBarButton.enabled = NO; 
    } 


    NSMutableArray *toolbarItems = [[NSMutableArray alloc] initWithArray:self.toolbar.items]; 

    if ([self.webview isLoading]){ 
     //Replace refresh button with loading spinner 
     [toolbarItems replaceObjectAtIndex:[toolbarItems indexOfObject:self.refreshBarButton] 
           withObject:self.activityBarButton]; 

     //Animate the loading spinner 
     [self.activityView startAnimating]; 
    } 
    else{ 
     //Replace loading spinner with refresh button 
     [toolbarItems replaceObjectAtIndex:[toolbarItems indexOfObject:self.activityBarButton] 
           withObject:self.refreshBarButton]; 

     [self.activityView stopAnimating]; 
    } 

    //Set the toolbar items 
    [self.toolbar setItems:toolbarItems]; 


    //Update other buttons 
    self.backBarButton.enabled = [self.webview canGoBack]; 
    self.forwardBarButton.enabled = [self.webview canGoForward]; 
} 
7

stavo cercando di fare la stessa cosa, e ho pensato impostazione self.navigationItem.rightBarButtonItem non ha funzionato perché l'indicatore di attività non visualizzerebbe. Si è scoperto che funzionava bene, non potevo vederlo perché ho una barra di navigazione bianca e lo stile UIActivityIndicatorView di default è anch'esso bianco. Quindi era lì ma invisibile. Con lo stile grigio ora posso vederlo.

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

(Duh.)

Problemi correlati