2009-08-21 13 views
9

Voglio sapere come implementare un'attivitàIndicatore in un'applicazione basata su WebView, ho scritto il seguente codice ma l'indicatore non viene visualizzato.Come implementare UIActivityIndicatorView quando UIWebView sta caricando? (iPhone ObjC)

Il file di caricamento WebView a livello locale, in modo da caricare molto veloce, ma quando si carica una pagina esterna si caricherà lentamente e ho bisogno l'indicatore ...

FirstViewController.h

#import <UIKit/UIKit.h> 

@interface FirstViewController : 
UIViewController <UIWebViewDelegate>{ 
    IBOutlet UIWebView *webview1; 
    NSURL *urlLocation;  
    IBOutlet UIActivityIndicatorView *m_activity; 
} 

@property (nonatomic, retain) UIActivityIndicatorView *m_activity; 

- (IBAction)searchbutton:(id)sender; 
- (IBAction)home:(id)sender; 

@end 

FirstViewController.m

#import "FirstViewController.h" 

@implementation FirstViewController 


@synthesize m_activity; 

// viewWillAppear loads every time younopen up this View 

- (void)viewWillAppear:(BOOL)animated { 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];   
    urlLocation = [NSURL fileURLWithPath:filePath]; 
    [webview1 loadRequest:[NSURLRequest requestWithURL:urlLocation]]; 
} 




- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {  
    //Initialization code  
    m_activity = nil; 
    }  
    return self; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView {  
    m_activity.hidden= TRUE;  
    [m_activity stopAnimating]; 
    NSLog(@"Web View started loading..."); 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView {  
    m_activity.hidden= FALSE;  
    [m_activity startAnimating];  
    NSLog(@"Web View Did finish loading"); 
} 

risposta

2

cosa è il problema qui, il codice che po sted sopra dovrebbe funzionare, tranne che non inizializzi l'indicatore da nessuna parte (forse lo fai in viewDidLoad) ma il codice mostrato sopra dovrebbe funzionare dato che l'indicatore è stato inizializzato correttamente e hai impostato la webview d elegate al controller della vista lì, ce l'ho lavorando su alcune delle mie app in cui utilizzo visualizzazioni web e indicatori per indicare quando viene caricato ...

19

Perché stai impostando l'indicatore di attività su zero nel tuo init?

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {  
    //Initialization code  
    m_activity = nil; 
    }  
    return self; 
} 

La chiamata a super inizializzato l'indicatore dal XIB (supponendo che si è collegato alla presa in IB), ma poi si sta impostando il riferimento a zero dopo che è stato inizializzato. Rimuovi quella linea. Quindi torna al builder dell'interfaccia e imposta la casella di controllo "Nascondi all'arresto". Ora è possibile semplificare il codice che consente di visualizzare l'indicatore:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    [m_activity stopAnimating]; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView {  
    [m_activity startAnimating];  
} 

Il "Nascondi se fermato" fa sì che l'indicatore di nascondere quando si smette da animare.

+2

Non è necessario disattivarlo anche nel metodo 'didFailLoadWithError'? –

0

È anche possibile utilizzare la proprietà UIWebView.loading.

doc di Apple: @property (nonatomic, sola lettura, getter = IsLoading) BOOL carico Descrizione Un valore booleano che indica se il ricevitore è fatto caricamento del contenuto. (sola lettura) Se SÌ, il ricevitore sta ancora caricando il contenuto; altrimenti, NO.

In iOS6 sembra che Apple abbia risolto alcuni problemi con questa proprietà. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

Problemi correlati