2011-09-19 42 views
7

我在UIWebView中有一個與Web服務交互的表單,當我提交表單時,數據被髮送到Web服務,並且它會將結果返回給另一個UIWebView。這兩個UIWebViews在導航控制器下,所以當使用提交表單時,它會滑動到另一個視圖來顯示結果。任何人都可以指出我如何實現這一目標?我在表單元素中填寫「action」屬性是什麼?我怎樣才能將用戶輸入返回到應用程序,以便我可以使用Web服務?我是這個領域的新手,任何幫助將不勝感激。謝謝!在UIWebView中提交表單


更新:

有沒有辦法從Web視圖回到我的程序保存表單數據?我認爲最好將表單數據保存回程序(即將參數存儲爲nsstring),當我單擊提交按鈕時,然後開始查詢Web服務。

+0

您的提交按鈕是本機UIButton還是HTML Button元素。 – sElanthiraiyan

+0

它的HTML「提交」按鈕,這就是爲什麼我想知道如何將數據保存到我的程序。 – Michael

+0

那麼你應該使用我在我的回答中提到的第二個工作。在提交按鈕中導航到一個虛假的url,並且shouldStartLoadWithRequest將被觸發。在該方法內部使用stringByEvaluatingJavaScriptFromString調用javascript方法。在該JavaScript方法中返回所需的數據。得到它了! – sElanthiraiyan

回答

11

可以使用

stringByEvaluatingJavaScriptFromString 

功能進行實彈射擊從Objective C的JavaScript方法,並從該方法的返回值。

例如

//Calling the getTheUsername in the javascript. 
NSString *userName = [yourWebView stringByEvaluatingJavaScriptFromString:@"getTheUsername()"]; 

,並在javascript

//Method in javascript 
function getTheUsername() 
{ 
return userNameVariable; 
} 

而且我懷疑,在這裏你可能會想要做的,反之亦然(從JavaScript調用OBJ-C法)。這不能直接完成這裏是工作。

設置一個UIWebViewDelegate,並實現方法webView:shouldStartLoadWithRequest:navigationType :.在你的JavaScript代碼中,導航到一些假的URL,它將你想傳遞給你的應用的信息進行編碼,例如: window.location =「someLink:// yourApp/form_Submitted:param1:param2:param3」; 在您的委託方法中,查找這些僞造URL,提取您需要的信息,採取適當的操作,並返回NO以取消導航。

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

    NSLog(@"%@",[[request URL] query]); 

    return YES; 
} 
+1

謝謝!第一個對我來說似乎更容易理解。 – Michael

1

如果我正確理解您的問題,我認爲以下步驟將幫助您提供解決方案。

  1. 在表單的操作中,您需要將URL寫入Web服務。
  2. 在您的表單中,輸入字段的名稱應與Web服務預期參數的名稱匹配。
  3. 在您的第一個UIWebView導航控件中,創建具有第二個UIWebView的屏幕對象,並將Web服務的響應設置爲該對象的實例成員。
  4. 在你的第一個UIWebView的導航控制,你需要寫
    [self presentModalViewController:webView2Object animated:YES];
  5. 在具有webView2,解析加載第二UIWebView的前響應的屏幕。並使用JavaScript注入顯示的頁面。
+1

這是否意味着我必須將請求放在窗體中?由於整個表單位於uiwebview中,我怎樣才能將結果返回到uiview(如表格視圖中的列表)? – Michael

+0

如果您將輸入元素的名稱保存爲與您的Web服務URL的參數名稱相同的形式,則該參數將自動與您的URL一起設置,並將提交給該URL。然後它會開始加載新頁面,您可以在webViewDidStartLoad委託方法中檢查它。 – Naved