2009-08-21 4 views
9

WebView 기반 앱에서 activityIndicator를 구현하는 방법을 알고 싶습니다. 다음 코드를 작성했지만 표시기가 나타나지 않습니다. 그것은 매우 빠르게로드하지만 외부 페이지를로드 할 때 느린로드 나는 표시를 필요로하므로 UIWebView가로드 중일 때 UIActivityIndicatorView를 구현하는 방법은 무엇입니까? (iPhone ObjC)

로컬 웹보기로드 파일

, ...

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

답변

2

뭐죠 여기에 문제의 코드 당신에게 포 위의 sted는 작동해야합니다. (어디서나 표시기를 초기화 할 필요는 없습니다.)하지만 위의 코드는 표시기가 올바르게 초기화되고 뷰 컨트롤러에 webview d elegate를 설정하면 작동합니다. 내 애플 리케이션 중 일부는 웹 뷰 및 표시기를 사용하여로드 할 때 나타냅니다 ...

19

왜 init에서 활동 표시기를 nil로 설정하고 있습니까?

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

슈퍼에 통화가 XIB에서 표시를 초기화 (당신이 IB에 콘센트에 연결된 가정) 만 초기화 됐어요 후 당신은 전무에 대한 참조를 설정합니다. 해당 행을 제거하십시오. 인터페이스 빌더로 돌아가서 "멈출 때 숨기기"체크 상자를 설정하십시오. 이제 표시기를 표시하는 코드를 단순화 할 수 있습니다.

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

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

"중지시 숨기기"를 선택하면 표시기가 애니메이션을 중지 할 때 표시기가 숨겨집니다.

+2

'didFailLoadWithError' 메소드에서도 해제 할 필요가 없습니까? –

0

UIWebView.loading 속성을 사용할 수도 있습니다.

애플의 문서 : @property (비 원자, 읽기 전용, 게터 = isLoading) BOOL로드 설명 수신기가로드 컨텐츠를 수행할지 여부를 나타내는 부울 값입니다. (읽기 전용) 예인 경우 수신자가 여전히 콘텐츠를로드하고 있습니다. 그렇지 않으면 아니오.

iOS6에서이 속성으로 Apple에서 일부 문제가 수정 된 것처럼 보입니다. http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html

관련 문제