iPhone開發-點擊UIWebView的連結地址時,更改連結地址,iphoneuiwebview
緣起
在開發的時候,有時會需要載入很多webview,當然webview的內容即可以是本地的html也可以是遠端伺服器的內容,隨需求而選擇需要用哪一種。
前兩天因為開發的需要,需要將一個應用A,轉換成一個新應用B,A和B中大部分功能是相同的,只是B中加了些新功能,所以B的代碼是基於A的基礎上添加的。A中有些功能需要調用webview,點擊webview中的某些超連結會跳到A中的相應的頁面,例如超連結的地址是a://app?gocontrol1。這樣問題就來了(當然不是學挖掘機哪家強?),當使用者在B應用的webview中點擊該超連結時會怎麼樣呢?答案是如果該手機裝了A應用,則會跳到A應用,如果沒裝則跳到B指定的頁面,應用亂跳了,這可不是咱們想要的結果。那怎麼辦呢?最直接的辦法是改服務端的網頁內容,將所有的超連結位址a://**改為b://**,但是如果這樣的webview如果少就直接改了(即直接通過伺服器判斷A或B之後返回A或B的內容),但是這樣的介面有10多個,如果改,會增加伺服器端很大的工作量,老大經過思索,決定還是改B用戶端的代碼,將B的webview中點擊後的超連結的地址由a://**轉換為b://**,這樣就可以通過最少的人力達到想要的效果。
實施
在UIWebView中點擊某個超連結時,希望改變超連結的地址(當然這是比較非常規的操作,但是有些妙招有時會節省很多時間)。想要監聽UIWebView中的超連結的事件,首先得設定UIWebView的delegate為當前的Controller,即
myBWebView.delegate = self;
之後找到UIWebView的點擊超連結的回調
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}之後在該回調中取出超連結的地址
NSURL *url = request.URL;
因為超連結中可以有其他非跳轉到本應用頁面的連結地址,例如http://www.baidu.com什麼的,所以需要找出以a://**的超連結位址
if ([[url scheme] isEqualToString:@"aichang"]) {}擷取到了超連結位址了,下一步就是改變url的scheme,使之變成b,代碼如下
NSString *newUrlString = [NSString stringWithFormat:@"b://%@%@", url.host, url.path];if (url.query) {newUrlString = [newUrlString stringByAppendingFormat:@"?%@", url.query];}url = [NSURL URLWithString:newUrlString];
好了,新的url就是咱們需要的的url了,全程代碼整理如下:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {// Determine if we want the system to handle it.NSURL *url = request.URL;if ([[url scheme] isEqualToString:@"a"]) {NSString *newUrlString = [NSString stringWithFormat:@"b://%@%@", url.host, url.path];if (url.query) {newUrlString = [newUrlString stringByAppendingFormat:@"?%@", url.query];}url = [NSURL URLWithString:newUrlString];if ([[UIApplication sharedApplication]canOpenURL:url]) {[[UIApplication sharedApplication]openURL:url];return NO;}}return YES;}
另 將B用戶端中info中的url schemes中的a改為b 如
尾聲
以正合,以奇勝。改伺服器端的網頁內容是最直接的方法,但是代價也有些大,直接改用戶端點擊後的連結地址,快捷方便簡單,何樂而不為呢?如果有其他的意見,歡迎討論。
教:IPhone開發UIWebView載入本地html一直沒顯示
pathForResource這個命令是擷取系統複製到沙箱的路徑。所以這個路徑不會是中文的。
另外,webView並沒有載入到某個視圖上,你讓它怎麼顯示?
怎控制更改UIWebView中的UIScrollView
UIWebView的唯一一個subview就是UIScrollView,不過蘋果並沒有提供直接的訪問方式給scrollview,因此當你直接這麼使用scrollview的時候 uiwebview.scrollview ,編譯沒有錯誤,但是啟動並執行時候會提示
[UIWebView scrollView]: unrecognized selector sent to instance因為webview的scrollview是一個蘋果私人的api因此我們需要利用一些小trick來獲得它的scrollview代碼如下: First we will pull the UIScrollView out from the UIWebView:NSArray *sv = [NSArray arrayWithArray:[myWebivew subviews]];
UIScrollView *webScroller = (UIScrollView *)[sv objectAtIndex:0];這樣我們就能夠擁有webview內建的scrollview的完全控制權。 NSArray *webViewSubViews = [NSArray arrayWithArray:[infoWebView subviews]]; UIScrollView *webScroller = (UIScrollView *)[webViewSubViews objectAtIndex:0]; [webScroller setContentOffset:CGPointMake(0, 0) animated:YES]; 當設定animated:YES後,首先一點移回頂部的時候可以有動畫效果,其次可以中斷原先的移動動畫效果(如果有的話)與系統的statusbar移到頂部效果一致。