在Web视图中加载指标
我的应用程序在表格视图中显示来自RSS提要的文章,然后当您select一行时,打开一个Web视图控制器来显示文章。 我正在尝试添加一个加载指示器。 如果我select一行,指标会短暂显示,然后在页面完全加载之前消失。 此外,如果我回到表格视图,并select不同的行,加载指标永远不会显示。 我使用了一个名为SVProgressHUD的自定义加载指示器,它在应用程序的其他地方工作正常。 我不认为这是问题。 我究竟做错了什么?
这是我的表视图中的didSelectRowAtIndexPath方法:
- (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。
#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
你应该使用webview
的delegate
function见下面
-(void)webViewDidStartLoad:(UIWebView *)webView{ //SHOW HUD } -(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ //KILL HUD } -(void)webViewDidFinishLoad:(UIWebView *)webView{ if(!webView.loading){ //KILL HUD } }
在webview
通常会发生caching,所以HUD可能不会显示,因为它会显示第一次加载。
我希望这会帮助你。
这是固定的。 我只是不得不补充
webView.delegate = self;