2010-06-03 17 views

Respuesta

48

Basta con crear dos diferentes UIBarButtonItem s

Uno para el indicador de actividad y otro para un UIBarButtonItem normal.

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

Cuando desee cambiar ellos, sólo reasignar la rightBarButtonItem a cualquier.

+0

tengo otra pequeña pregunta. Con esta implementación, ¿cómo puedo llamar a beginAnimation y stopAnimation en UIActivityIndicatorView? Gracias – Luca

+0

Puede crear una propiedad para UIActivityIndicatorView. –

+0

Muchas gracias – Luca

10

Aquí lo que funciona para mí:

- (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

que utiliza una técnica similar para actualizar un botón en un UIToolbar cuando un UIWebView está recargando (ya que no parece ser posible mostrar/ocultar barra individual elementos del botón). En este caso, debe intercambiar todos los elementos en la barra de publicaciones de UIT.

@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

yo estaba tratando de hacer lo mismo, y me pareció establecer self.navigationItem.rightBarButtonItem no funcionó debido a que el indicador de actividad, no se mostrará. Resulta que estaba funcionando bien, simplemente no pude verlo porque tengo una barra de navegación blanca y el estilo predeterminado UIActivityIndicatorView también es blanco. Así que estaba allí pero invisible. Con el estilo gris, ahora puedo verlo.

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

(Duh.)