UIActivityIndicatorView не работает программно на UIWebView в mySubView - PullRequest
0 голосов
/ 23 мая 2011

Мой myViewController.h содержит:

#import <UIKit/UIKit.h>

@interface myViewController : UIViewController {

    UIScrollView *myScrollView;

    UIView *mySubView;

    UIWebView *myWebView;

    UIActivityIndicatorView *myIndicator;

}

@property (nonatomic, retain) IBOutlet UIScrollView *myScrollView;

@end

Мой myViewController.m содержит:

#import "myViewController.h"

@implementation myViewController

@synthesize myScrollView;

...

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *bgColors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];

    for (int i = 0; i < bgColors.count; i++)
    {
        CGRect frameNew;
        frameNew.origin.x = self.myScrollView.frame.size.width * i;
        frameNew.origin.y = 0;
        frameNew.size = self.myScrollView.frame.size;

        mySubView = [[UIView alloc] initWithFrame:frameNew];
        mySubView.backgroundColor = [bgColors objectAtIndex:i];

        [self.myScrollView addSubview:mySubView];

        myIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        myIndicator.center = CGPointMake(160, 100);
        myIndicator.hidesWhenStopped = NO;

        CGRect webFrame = CGRectMake(self.myScrollView.frame.size.width * i, 0, 320, 320);
        myWebView = [[UIWebView alloc] initWithFrame:webFrame];
        [myWebView setDelegate:(id)self];
        [myWebView addSubview:myIndicator];

        NSString *urlAddress = @"http://www.google.com/";
        NSURL *url = [NSURL URLWithString:urlAddress];
        NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
        [myWebView loadRequest:requestObj];

        [self.myScrollView addSubview:myWebView];

        [myIndicator release];
        [myWebView release];
        [mySubView release];
    }

    self.myScrollView.contentSize = CGSizeMake(self.myScrollView.frame.size.width * bgColors.count, self.myScrollView.frame.size.height);
}

-(void)webViewDidStartLoad: (UIWebView *)webView
{
    NSLog(@"Web view did start loading");
    [myIndicator startAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

-(void)webViewDidFinishLoad: (UIWebView *)webView
{
    NSLog(@"Web view did finish loading");
    [myIndicator stopAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [myIndicator stopAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSString* errorString = [NSString stringWithFormat:@"<html>%@</html>", error.localizedDescription];
    [myWebView loadHTMLString:errorString baseURL:nil];
}

...

Индикатор загрузки не работает на первых двух mySubView в myWebView,работает только в последнем mySubView в myWebView.

В первых двух mySubView в myWebView, myIndicator отображается, но не активен.

Скажите, что не так делает

1 Ответ

4 голосов
/ 23 мая 2011

Это потому, что myIndicator указывает на последнее представление индикатора активности. Все предыдущие ссылки потеряны. К счастью, поскольку это подпредставление веб-представления, мы можем получить ссылку на него. Это должно помочь -

-(void)webViewDidStartLoad: (UIWebView *)webView
{
    UIActivityIndicatorView *actView;
    for ( id object in webView.subviews ) {
        if ([object isMemberOfClass:[UIActivityIndicatorView class]]) {
            actView = (UIActivityIndicatorView*)object;
        }
    }
    NSLog(@"Web view did start loading");
    [actView startAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
}

-(void)webViewDidFinishLoad: (UIWebView *)webView
{
    UIActivityIndicatorView *actView;
    for ( id object in webView.subviews ) {
        if ([object isMemberOfClass:[UIActivityIndicatorView class]]) {
            actView = (UIActivityIndicatorView*)object;
        }
    }
    NSLog(@"Web view did finish loading");
    [actView stopAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    UIActivityIndicatorView *actView;
    for ( id object in webView.subviews ) {
        if ([object isMemberOfClass:[UIActivityIndicatorView class]]) {
            actView = (UIActivityIndicatorView*)object;
        }
    }
    [actView stopAnimating];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    NSString* errorString = [NSString stringWithFormat:@"<html>%@</html>", error.localizedDescription];
    [myWebView loadHTMLString:errorString baseURL:nil];
}
...