2

アプリの一部を JS で記述し、WebView 内で実行しています。UIWebView shouldStartLoadWithRequest メソッドを使用して、JS と obj-c 間の通信手段として http 要求をキャプチャしています。これは、shouldStartLoadWithRequest メソッド内から webview を介して Modal View Controller をロードしようとするまでうまく機能します。これが発生すると、 shouldStartLoadWithRequest は呼び出されなくなります。場合によっては、このモーダル ビュー コントローラーを閉じて Web ビューに戻り、いくつかのことを行ってから、モーダル コントローラーを再提示する必要があります。モーダル コントローラーが初めて正常に表示された後、それを閉じて、JavaScript から URL に移動して再度表示しようとすると、表示されなくなります。shouldStartLoadWithRequest 内の NSLog は実行されません。

私のjavascriptでは、次のようなことをします:

 window.location='myapp:whateverMethod';

目的の C コードは次のようになります。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *requestString = [[request URL] absoluteString];
    NSLog(@"REQUEST URL: %@", requestString);
    if([requestString hasPrefix:@"myapp:"]) {
        NSArray *components = [requestString componentsSeparatedByString:@":"];
        NSString *function = [components objectAtIndex:1];
        if([self respondsToSelector:NSSelectorFromString(function)]) {
            [self performSelector:NSSelectorFromString(function)];
        }
        return NO;
    }
    return YES;
}

-(void) whateverMethod {
    NSLog(@"whateverMethod called!");
    // This is a quick way to grab my view controller from the storyboard, so assume it exists
    UIViewController *splash = [self.storyboard instantiateViewControllerWithIdentifier:@"splashViewController"];
    [self presentModalViewController:splash animated:NO];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        [self dismissModalViewController:splash animated:NO];
    });
}

この時点で、私の Web ビューはまだ表示されています。Web アプリケーションでページからページに移動すると、すべての JavaScript がうまく機能しますが、Web ビューの "shouldStartLoadWithRequest" デリゲート メソッドは呼び出されなくなりました。理由がわかりません。誰にもアイデアはありますか?

4

4 に答える 4

0

同じ問題が発生しましたが、 href="#" アンカーの使用に関連しています。

このスタックオーバーフローの回答はそれをソートしました

そのスレッドには widow.location を扱う回答が他にもあるので、うまくいくかもしれません。

于 2013-08-07T10:10:29.683 に答える
0

私は(恥ずかしいことに)今日これに数時間を費やし、私のビューでDidDisappear:UIWebViewDelegateをnilに設定していることに気付きました!

修正するために必要だったのは、モーダルが閉じられ、UIWebViewDelegate が再設定され、すべてが再び機能したことだけでした。

于 2014-09-19T06:13:13.123 に答える