1

約 1 時間ほど前に正常に動作していたこのコード セットがあります。その後、数分前にもう一度起動しようとすると、UIWebView に白い画面が表示されます。しかし、ここで -(bool) メソッドをブロックすると、viewDidLoad が発生します。(NSLogでテスト済み)コードに何が起こったのか聞いてもよろしいですか?? 機能していたのに、突然機能しなくなりました。

.m

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {

    NSString *titleString = @"Error Loading Page";
    NSString *messageString = [error localizedDescription];
    NSString *moreString = [error localizedFailureReason] ?
    [error localizedFailureReason] :
    NSLocalizedString(@"Try typing the URL again.", nil);
    messageString = [NSString stringWithFormat:@"%@. %@", messageString, moreString];

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:titleString
                                                        message:messageString delegate:self
                                              cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
    [alertView show];

}

上記のメソッドを実装すると、UIWebView を開いたときにアプリが常にポップアップし、エラー ドメイン エラー -999 ノンストップと表示されます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range1= [currentURL rangeOfString:@"news"];
    NSRange range2= [currentURL rangeOfString:@"pdf"];
    if (range1.location == NSNotFound)
    {
        NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];

        return YES;
    }
    if(range2.location==NSNotFound)
    {
        NSURL * url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];
        return YES;
    }

    return NO;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    webView.scalesPageToFit=YES;
    webView.delegate = self;

    NSString *urlAddress = @"http://www.imc.jhmi.edu/news.html";
    NSURL *url =[NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
    NSLog(@"sadfasdf");
}

.h @interface ViewController : UIViewController{ IBOutlet UIWebView*webView; }

@property(nonatomic,strong) UIWebView*webView;

@end
4

2 に答える 2

1

リクエストをロードすると、デリゲート メソッド

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

呼ばれます。

その方法では、同じページを無限にリロードしようとしています。

エラー Domain=NSURLErrorDomain Code=-999 「The operation could not be completed. (NSURLErrorDomain error -999.)」 UserInfo=0xe203e80 {NSErrorFailingURLKey= http://www.imc.jhmi.edu/news.html , NSErrorFailingURLStringKey= http ://www.imc.jhmi.edu/news.html }

あなたのコードを試してみたところ、このエラーが発生しました。このエラーは、WebView の前の要求が完了する前に別の要求が行われた場合に発生することがあります。そのため、デリゲート メソッドで読み込み要求を繰り返すことで、これらの条件を回避するようにしてください。

if(range2.location==NSNotFound)

この条件は常に true になります。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *currentURL = [[request URL] absoluteString];
    NSRange range1= [currentURL rangeOfString:@"news"];
    if (range1.location == NSNotFound)
    {
        NSURL *url = [NSURL URLWithString:@"http://www.imc.jhmi.edu/news.html"];
        [webView loadRequest:[NSURLRequest requestWithURL:url]];
        return YES;
    }

    return YES;
}
于 2012-06-28T04:08:50.627 に答える
0

UIWebView のデリゲート メソッド:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request     navigationType:(UIWebViewNavigationType)navigationType{
}

Web ビューがコンテンツのロードを開始する必要がある場合は YES を返し、それ以外の場合は NO を返します。次のメソッドを呼び出すと、viewDidLoad メソッドでメソッドが呼び出されます。

[webView loadRequest:requestObj];

また、デリゲート メソッドでは、同じメソッドを再度呼び出しています。

[webView loadRequest:[NSURLRequest requestWithURL:url]];

これにより、デリゲート メソッドが何度も呼び出され、無限ループが形成されます。これは毎回 loadRequest に発生しますが、ロードする前に同じ loadRequest が再度呼び出され、ループが形成されます。

このメソッドで loadRequest を実行する必要はありません。必要な条件に対して YES または NO を返すだけです。

于 2012-06-28T04:28:45.247 に答える