2009-08-21 5 views
9

Je veux savoir comment implémenter un indicateur d'activité dans une application basée sur WebView, j'ai écrit le code suivant mais l'indicateur n'apparaît pas.Comment implémenter un UIActivityIndicatorView lors du chargement de UIWebView? (iPhone ObjC)

Le fichier de charge WebView localement, donc il charge très rapide, mais quand il charge une page externe, il charge lent et je dois l'indicateur ...

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

Répondre

2

Quelle est la question ici, le code que vous po sted ci-dessus devrait fonctionner, sauf que vous n'initialisez l'indicateur nulle part (peut-être dans viewDidLoad) mais le code ci-dessus devrait fonctionner étant donné que l'indicateur a été initialisé correctement et que vous avez défini le webview travailler sur certaines de mes applications où j'utilise webviews et indicateurs pour indiquer quand son chargement ...

19

Pourquoi mettez-vous votre indicateur d'activité à zéro dans votre init?

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

L'appel à super initialisé votre indicateur de votre XIB (en supposant qu'il connecté à votre sortie dans IB), mais vous définissez la référence à zéro après qu'il a été initialisé. Retirez cette ligne. Revenez ensuite dans le constructeur de l'interface et cochez la case "Cacher à l'arrêt". Maintenant, vous pouvez simplifier votre code qui affiche l'indicateur:

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

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

Le « Cacher à l'arrêt » provoque l'indicateur de se cacher lorsque vous arrêtiez de animant.

+2

N'avez-vous pas besoin de le désactiver dans la méthode 'didFailLoadWithError'? –

0

La propriété UIWebView.loading peut également être utilisée.

doc Apple: @property (non atomique, en lecture seule, getter = isLoading) BOOL chargement description Une valeur booléenne indiquant si le récepteur se fait du chargement du contenu. (lecture seule) Si OUI, le récepteur continue de charger le contenu; sinon, NON.

Dans iOS6, il semble que Apple a également résolu certains problèmes avec cette propriété. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

Questions connexes