0

そのような質問がたくさんあることは知っていますが、私の質問は他の質問とは少し違うようです. 私が本当にやりたいことは、 javascript から目的の C メソッドを呼び出すことだけです。多くの回答やチュートリアルで提案されているように、パラメーターを前後に送信する必要なく、これを行う方法があると確信しています。これの目的は、phonegap アプリのユーザーが HTML ボタンをクリックしてステータス バーを非表示にできるようにすることです。これを実現するには、目的の C メソッドを実行するようにアプリに指示する方法を見つける必要があります。HideStatusBar

-(void) HideStatusBar {
  [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}

パラメータを送信したくありません。私に説明してほしいのは、obj c に javascript からメソッド呼び出しを行うように指示する方法だけです。解決策の 1 つは、パラメーターを webviews アドレス フィールドに設定し、 obj C 経由で取得することですが、私の場合はもっと簡単な解決策があると確信しています。

phonegap プラグインを作成しようとすることから始めましたが、「反対側」への「メッセージ アクロス」を取得できなかったため、目的 C でのメソッド呼び出しが何らかの理由で発生しませんでした。必要に応じてここにコードを投稿できますが、もっと簡単な解決策が必要だと思いました。

javascript 内から obj c メソッドを呼び出す最も簡単な方法を誰かに説明してもらえますか?

編集

私はこれを機能させましたがshouldStartLoadWithRequest、webview が最初にロードされたときにのみ呼び出されます (タイトルに示されているように)。これは、URL を更新すると、メソッドが呼び出されないことを意味します。これは私が今それを行う方法です:

Javascript

('#hideStatusBar').live('click',function(event) {
    window.history.pushState('page2', 'Title', '/doc.html://hideStatusBar');
});

オブジェクティブ C

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

//NSString *currentURL = request.URL.absoluteString;

if([request.URL.absoluteString isEqualToString:@"http://domain.com/doc.html://hideStatusBar"]){
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    return NO;
}
return YES;
}

前述のように、javascript を介して HTML ドキュメントの URL を更新するたびに、このメソッドを実行したいと考えています。さらにアイデアはありますか?

4

2 に答える 2

1

最も簡単で、私の意見では間違った方法は、UIWebViewDelegate メソッド shouldStartLoadWithRequest を使用することです。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
                                                 navigationType:(UIWebViewNavigationType)navigationType {
    //suppose you call yourApp://hideStatusBar
    if([request.url.absoluteString isEqualToString:@"yourApp://hideStatusBar"]){
        [self hideStatusBar];
        return NO;
    }
    return YES; 
}

JavaScript から

document.location = 'yourApp://hideStatusBar'

すでに Cordova(Phonegap) を使用している場合は、単純なプラグインを作成して、リクエストをいじるのを避けることができます。

于 2013-02-09T00:04:24.443 に答える
1

例のチュートリアルには正しい考えがあります。独自の急ごしらえの URL スキームを実行し、引数 (またはその他のもの) を URL にシリアル化します。

UIWebViewユーザーがあなたが制御する を閲覧しているwebView:shouldStartLoadWithRequest:navigationType:場合、ユーザーがリンクをクリックしたときにパッチを適用してそれを使用してインターセプトできます。その後、デリゲートは URL をインターセプトし、UIWebView の場所を変更する代わりに、デリゲートでコードの実行をディスパッチします。

于 2013-02-09T00:05:48.730 に答える