2012-02-21 5 views
1

いくつかの状態を格納しているUIWebViewベースのアプリケーションがあります。私はネイティブタブバーと上部バーを持っています。私が必要とするのは、ネイティブバーをクリックすると、UIWebViewに格納されているデータを保持するということです。 Objective-Cは、Objective-Cを呼び出すUIWebViewのjavascriptを呼び出します。スレッドの問題

はこれを行うために、私は、JSONオブジェクトを作成するためにevaluateJavaScriptByStringと呼ばれ、それがUIWebViewDelegateプロトコルを介して目的-Cへのコールバックを行います。

しかし、私は、コールバックが非同期であるため、私のメイン・トランザクションは、データがロードされる前に起こることがわかります。

どのようにこの問題を解決できるか考えてみましょうか?

更新:より良い問題を説明するために: -

  • 私は誰かがにいくつかのデータを置くことフォームをHTMLページを持っています。
  • マイタブバーはネイティブです。
  • タブバーのボタンをクリックすると、HTMLのデータがObjective-Cモデルに保存され、ビューが別のビューに変更されます。

ボタンをクリックするとJavaScriptコールが(Objective-Cに送信するJSON文字列を作成するために)発生し、このデータはobj-cモデルに保存されます。ただし、これは非同期に発生します。したがって、データがモデルにロードされる前に画面が変更されます。次の画面を更新すると、正しいデータが表示されます。この周りに道があるかどうか疑問に思っていた。

注、私はWebViewsからObjective-Cの関数を呼び出す方法を知っています。とにかくJSOBjBridgeを使用しています。

答えて

0

ちょうどあなたがevaluateJavaScriptByStringに転送することを、あなたのjavascriptのコードの最後に、この@"some_var = MAKE_JSON(); window.location = \"myapp://callback/\" + escape(some_var)"のようなものを追加します。shouldStartLoadWithRequest::navigationType:WebViewのを実装するのUIWebViewのデリゲートでは

と、このようなmyapp://プレフィックスで全てのURLをキャッチ:

- (BOOL)   webView: (UIWebView *) webView 
shouldStartLoadWithRequest: (NSURLRequest *) request 
      navigationType: (UIWebViewNavigationType) navigationType { 
    NSString *url = @"myapp://"; 
    NSString *path = request.mainDocumentURL.relativePath; 
    NSString *callbackURL = @"callback/"; 
    if ([path hasPrefix:url]) { 
     path = [path substringFromIndex:[url length]]; 
     if ([relPath hasPrefix:callbackURL]) { 
      NSString *json = [path substringFromIndex:[callbackURL length]]; 
      //TODO: Work with json 
     } 
     return NO; 
    } 
    return [super webView:webView shouldStartLoadWithRequest:request navigationType: navigationType]; 
} 

私はこのコードをテストしませんでした。私はちょうどそれを最初から書きましたが、うまくいくはずです。私はすでにこのようにしました。

+0

これはすでにJSObjBridgeを使用して行われています。問題はそうではありません。問題をより良く説明するには - – VikrantY

+0

tabbarController:shouldSelectViewController:でNOを返すことができ、モデルにデータが書き込まれるときにタブを手動で変更すると、それはnotificationcenterを使って行うことができます。とにかく、JSObjBridgeとは何ですか?それはあなたまたは第三者ですか? – Antigluk

+0

はいJSOBjBridgeは第三者ですが、JavascriptからObj-C関数を呼び出すのはかなり標準的です。通知センターを理解する必要があります。 – VikrantY

関連する問題