2013-08-13 2 views
3

내 앱은 RSS 피드의 기사를 표보기로 표시 한 다음 행을 선택하면 웹보기 컨트롤러를 열어 기사를 표시합니다. 로드 표시기를 추가하려고합니다. 행을 선택하면 표시기가 잠시 표시된 다음 페이지가 완전히로드되기 전에 사라집니다. 또한 테이블보기로 돌아가서 다른 행을 선택하면 로딩 표시기가 나타나지 않습니다. SVProgressHUD라는 사용자 지정로드 표시기를 사용하고 있으며 응용 프로그램의 다른 곳에서도 정상적으로 작동합니다. 나는 그것이 문제라고 생각하지 않는다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?웹 표시기에 로딩 표시기

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[webViewController webView]loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 

    [self.navigationController pushViewController:webViewController animated:YES]; 

    // Grab the selected item 
    RSSItem *entry = [[channel items]objectAtIndex:[indexPath row]]; 

    // Construct a URL with the link string of the item 
    NSURL *url = [NSURL URLWithString:[entry link]]; 

    // Construct a request object with that URL 
    NSURLRequest *req = [NSURLRequest requestWithURL:url]; 

    // Load the request into the web view 
    [[webViewController webView]loadRequest:req]; 
    webViewController.hackyURL = url; 
} 

로딩 표시가 WebViewController의 viewDidLoad에이 라인에서 시작됩니다 : 여기

[SVProgressHUD showWithStatus:@"Loading"]; 

그리고 내 WebViewController입니다

여기 내 테이블보기에서 내 didSelectRowAtIndexPath 방법입니다. 당신은 webviewdelegate 기능을 사용해야합니다

#import "WebViewController.h" 
#import "TUSafariActivity.h" 
#import "SVProgressHUD.h" 

@implementation WebViewController 
@synthesize webView=webView, hackyURL=hackyURL; 

- (void)loadView 
{ 
    // Create an instance of UIWebView as large as the screen 
    CGRect screenFrame = [[UIScreen mainScreen]applicationFrame]; 
    UIWebView *wv = [[UIWebView alloc]initWithFrame:screenFrame]; 
    webView = wv; 
    NSLog(@"%@",webView.request.URL); 
    // Tell web view to scale web content to fit within bounds of webview 
    [wv setScalesPageToFit:YES]; 

    [self setView:wv]; 
} 

- (UIWebView *)webView 
{ 
    return (UIWebView *)[self view]; 
} 

- (void) showMenu 
{ 
    NSURL *urlToShare = hackyURL; 
    NSArray *activityItems = @[urlToShare]; 
    TUSafariActivity *activity = [[TUSafariActivity alloc] init]; 

    __block UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:@[activity]]; 
    activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePostToWeibo, UIActivityTypeSaveToCameraRoll]; 

    [self presentViewController:activityVC animated:YES completion:^{activityVC.excludedActivityTypes = nil; activityVC = nil;}]; 
} 

- (void)toggleBars:(UITapGestureRecognizer *)gesture 
{ 
    BOOL barsHidden = self.navigationController.navigationBar.hidden; 

    if (!barsHidden) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 
     [self hideTabBar:self.tabBarController]; 
    } 
    else if (barsHidden) 
    { 
     [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; 
     [self showTabBar:self.tabBarController]; 
    } 

    [self.navigationController setNavigationBarHidden:!barsHidden animated:YES]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    [SVProgressHUD showWithStatus:@"Loading"]; 

    UIBarButtonItem *systemAction = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showMenu)]; 
    self.navigationItem.rightBarButtonItem = systemAction; 

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(toggleBars:)]; 
    [webView addGestureRecognizer:singleTap]; 
    singleTap.delegate = self; 

    // self.hidesBottomBarWhenPushed = YES; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

- (void) hideTabBar:(UITabBarController *) tabbarcontroller 
{ 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    float fHeight = screenRect.size.height; 
    if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 
    { 
     fHeight = screenRect.size.width; 
    } 

    for(UIView *view in tabbarcontroller.view.subviews) 
    { 
     if([view isKindOfClass:[UITabBar class]]) 
     { 
      [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; 
     } 
     else 
     { 
      [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; 
      view.backgroundColor = [UIColor blackColor]; 
     } 
    } 
    [UIView commitAnimations]; 
} 

- (void) showTabBar:(UITabBarController *) tabbarcontroller 
{ 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    float fHeight = screenRect.size.height - 49.0; 

    if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 
    { 
     fHeight = screenRect.size.width - 49.0; 
    } 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    for(UIView *view in tabbarcontroller.view.subviews) 
    { 
     if([view isKindOfClass:[UITabBar class]]) 
     { 
      [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; 
     } 
     else 
     { 
      [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; 
     } 
    } 
    [UIView commitAnimations]; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    //stop the activity indicator when done loading 
    [SVProgressHUD dismiss]; 
} 

@end 

답변

11

는 첫 번째로드에 대한 표시됩니다으로 HUD가 오래 표시되지 않을 수 있으므로 일반적으로 캐싱이 발생 webview에서

-(void)webViewDidStartLoad:(UIWebView *)webView{ 
    //SHOW HUD 
} 

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 
    //KILL HUD 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView{ 

    if(!webView.loading){ 
     //KILL HUD 
    } 
} 

아래를 참조하십시오.

도움이되기를 바랍니다.

+0

UIActivityIndicatorView를 사용하여 이러한 메서드를 구현하려고 시도했지만 표시되지만 표시가 끝나고 페이지로드가 완료되면 사라질 수는 없습니다. – raginggoat

+0

나는 그 방법에 중단 점을 배치하고 그들은 심지어 전화를받지 않는 것 같습니다. – raginggoat

3

이 문제가 해결되었습니다. 방금 추가해야했습니다

webView.delegate = self; 
관련 문제