2009-08-21 5 views
9

Ich möchte wissen, wie ein ActivityIndicator in einer WebView-basierten App zu implementieren, schrieb ich den folgenden Code, aber der Indikator wird nicht angezeigt.Wie implementieren Sie eine UIActivityIndicatorView, wenn das UIWebView geladen wird? (iPhone ObjC)

Die Webansicht Last Datei lokal, so dass es sehr schnell laden, aber wenn es eine externe Seite laden Sie es langsam laden und ich brauche das Kennzeichen ...

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

Antwort

2

Was ist das Problem hier, der Code, den Sie po Stated oben sollte funktionieren, außer dass Sie den Indikator nirgends initialisieren (vielleicht tun Sie in ViewDidLoad), aber der oben gezeigte Code sollte funktionieren, da der Indikator korrekt initialisiert wurde und Sie die Webansicht auf den View-Controller dort einstellen, ich habe es Ich arbeite an einigen meiner Apps, wo ich WebViews und Indikatoren verwende, um anzuzeigen, wann es geladen wird ...

19

Warum setzen Sie Ihren Aktivitätsindikator auf Null in Ihrem init?

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

Der Aufruf von super Ihre Anzeige von Ihrem XIB initialisiert (vorausgesetzt, Sie es an die Steckdose in IB angeschlossen ist), aber dann, nachdem Sie setzen den Verweis auf Null initialisiert worden ist. Entferne diese Zeile. Gehen Sie dann zurück in den Schnittstellen-Builder und setzen Sie das Kontrollkästchen "Bei gestopptem Zustand ausblenden". Jetzt können Sie Ihren Code vereinfachen, die die Anzeige zeigt:

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

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

Die „Hide wenn gestoppt“ bewirkt, dass die Anzeige zu verstecken, wenn Sie es von Animieren stoppen.

+2

Müssen Sie es nicht auch in der Methode 'didFailLoadWithError' ausschalten? –

0

Die Eigenschaft UIWebView.loading kann ebenfalls verwendet werden.

Apple doc: @property (nonatomic, nur lesbar, Getter = isLoading) BOOL Laden Beschreibung Ein boolescher Wert, der angibt, ob der Empfänger Laden Inhalt durchgeführt wird. (schreibgeschützt) Wenn ja, lädt der Receiver noch Inhalte; sonst, NEIN.

In iOS6 sieht es aus, als ob Apple einige Probleme mit dieser Eigenschaft behoben hat. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html