Как реализовать UIActivityIndicatorView, когда UIWebView загружается? (iPhone ObjC) - PullRequest
9 голосов
/ 21 августа 2009

Я хочу знать, как реализовать ActivityIndicator в приложении на основе WebView. Я написал следующий код, но индикатор не отображается.

Файл веб-просмотра загружается локально, поэтому он загружается очень быстро, но при загрузке внешней страницы он загружается медленно и мне нужен индикатор ...

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

Ответы [ 3 ]

19 голосов
/ 21 августа 2009

Почему вы устанавливаете свой индикатор активности на ноль в вашей инициализации?

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

Вызов super инициализировал ваш индикатор с вашей XIB (при условии, что вы подключили его к своей розетке в IB), но затем вы устанавливаете ссылку на ноль после его инициализации. Удалить эту строку. Затем вернитесь в конструктор интерфейса и установите флажок «Скрыть при остановке». Теперь вы можете упростить свой код, отображающий индикатор:

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

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

«Скрыть при остановке» заставляет индикатор скрываться при остановке анимации.

2 голосов
/ 21 августа 2009

В чем здесь проблема, код, который вы разместили выше, должен работать, за исключением того, что вы нигде не инициализируете индикатор (может быть, вы делаете это в viewDidLoad), но код, показанный выше, должен работать, если индикатор был инициализирован правильно и вы установили веб-представление Я элегантно настроен на контроллер представления, он работает над некоторыми из моих приложений, где я использую веб-просмотры и индикаторы, чтобы указать, когда он загружается ...

0 голосов
/ 27 августа 2012

UIWebView.loading свойство также может быть использовано.

Документ Apple: @property (nonatomic, readonly, getter = isLoading) BOOL загрузка Описание Логическое значение, указывающее, завершен ли приемник загрузкой контента. (Только для чтения) Если ДА, получатель все еще загружает контент; в противном случае, нет.

В iOS6 похоже, что Apple также исправила некоторые проблемы с этим свойством. http://code -gotcha.blogspot.fi / 2012/08 / uiwebviewloading в КСН-6-fixed.html

...