UIWebView加載本地HTML5文件

UIWebView加載本地HTML5文件
一.準(zhǔn)備HTML文件及其資源文件
使用UIWebView加載本地的HTML文件 index.html,在index.html中引用了本地的圖片崇堰、CSS文件、JS文件以及外部的圖片。index.html內(nèi)容如下
<html> <head> <link href="index.css" rel="stylesheet" type="text/css"> <script type="text/javascript"language="javascript"src="index.js"> </head> <body> <p>This is local Image</p>

image
image

<p>this is local image from CSS.</p> <div id="myimage"> </div>
<p>this is external image.</p>
image
image
</body></html>

HTML中會顯示3張圖片晦溪,第一張是html從本地讀取的圖片尤溜,第二張是通過CSS從本地讀取的圖片仪召,第三張是通過絕對地址從外部讀取的圖片敷搪。index.css文件內(nèi)容如下:
body { padding: 0px; margin: 0px;}p { font-size: 15px; color: #808080; font-family: Arial, Helvetica, sans-serif;} #myimage { background-image: url(SmallSmiley.png); background-repeat: repeat-x;}

index.js文件內(nèi)容為:
function rewrite(){ document.write("This text was written by an external script!")}

index.js還有引用到了兩個本地圖片文件:SmallSmiley.png

Smiley.png
Smiley
Smiley

二.加載本地HTML文件
將html文件及相關(guān)資源添加到項目中
localhtml
localhtml
需要注意的是循捺,把js文件加入到項目時會默認將其當(dāng)做需要編譯的代碼稼锅,需要在TARGETS->Build Phases中的”Compile Sources”中找到該js文件吼具,并將其移到上面的Copy Bundle Resources中。
CopyBundleResources
CopyBundleResources

然后在代碼中可以用兩種方法加載矩距。1.第一種方式,使用loadRequest:方法加載本地文件NSURLRequest
NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];NSURL* url = [NSURL fileURLWithPath:path];NSURLRequest* request = [NSURLRequest requestWithURL:url] ;[webView loadRequest:request];

2.第二種方式,使用loadHTMLString:baseURL:加載HTML字符串
NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];[webView loadHTMLString:html baseURL:baseURL];

加載后的顯示效果如下,本地圖片,CSS加載的本地圖片拗盒,以及外部圖片都可以正常顯示。


在HTML頁面加載完畢后锥债,我們可以使用UIWebViewstringByEvaluatingJavaScriptFromString:方法執(zhí)行JavaScript語句陡蝇。如下:

  • (void)webViewDidFinishLoad:(UIWebView *)webView{ [webView stringByEvaluatingJavaScriptFromString:@"rewrite();"];}

執(zhí)行js代碼后,頁面顯示就變成了


三.關(guān)于baseURL
loadHTMLString:baseURL:方法的第二個參數(shù)是baseURL,baseURL即HTML字符串中引用到資源的查找路徑哮肚,沒有引用外部資源時登夫,可以直接傳nil;若引用了外部資源,一般情況下使用mainBundle的路徑即可允趟,即
NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];

這是因為,Xcode項目中的文件路徑都是虛擬的恼策,在APP中實際不存在,即在APP中潮剪,幾乎所有的文件都可以從mainBundle根目錄下直接訪問涣楷,當(dāng)然,例外總是存在的抗碰。
在將文件/文件夾加入到項目時狮斗,有這樣兩個選項“Create Folder References for any added folders”和“Recursively create groups for any added folders”。

默認情況下為第一種弧蝇,即所有加入到項目的文件都會在mainBundle根路徑下碳褒,即不管加入項目的文件的目錄結(jié)構(gòu)如何迄汛,在APP中都可以通過mainBundlePath/filename來訪問到;如果采用第二種方式骤视,則就會保留相對路徑鞍爱,需要通過mainBundlePath/path/filename來訪問。通過這兩種方式到項目的文件夾顯示具有不同的顏色专酗,如下
addfolder
addfolder
images1目錄是使用“Create Folder References for any added folders”增加的目錄,images2目錄是使用“Recursively create groups for any added folders”增加的目錄睹逃。
獲取images1目錄下文件的代碼如下:
NSString* image1Path = [[NSBundle mainBundle] pathForResource:@"image1"ofType:@"jpg"];NSString* image11Path = [[NSBundle mainBundle] pathForResource:@"image11"ofType:@"jpg"];

images1和images11目錄實際是不存在的,下面代碼返回的路徑都是nil
NSString* images1Dir = [[NSBundle mainBundle] pathForResource:@"images1"ofType:nil];NSString* images11Dir = [[NSBundle mainBundle] pathForResource:@"images11"ofType:nil];

對于images2目錄以及目錄下的文件路徑,其在APP中仍然保持了目錄關(guān)系祷肯,就不能用上述方法獲取沉填,而且目錄路徑是真實存在的,應(yīng)該使用的代碼如下:
NSString* images2Path = [[NSBundle mainBundle] pathForResource:@"image2"ofType:@"jpg"inDirectory:@"images2"];NSString* image22Path = [[NSBundle mainBundle] pathForResource:@"image22"ofType:@"jpg"inDirectory:@"images2/images22"];NSString* images2Dir = [[NSBundlemainBundle] pathForResource:@"images2"ofType:nil];NSString* images2Dir = [[NSBundle mainBundle] pathForResource:@"images22"ofType:nilinDirectory:@"images2"];

還有一種比較特殊的目錄是以.bundle為后綴的目錄,將其加入到項目是不管選擇的是哪個選項佑笋,其都會保持其目錄結(jié)構(gòu)翼闹。

對子bundle的訪問,可以通過同images2目錄相同的方法訪問蒋纬,但一般情況下是先獲取到子Bundle,再通過子Bundle獲取到其里面的資源猎荠。
NSBundle bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"images" ofType:@"bundle"]];NSString imagebPath = [bundle pathForResource:@"imageb"ofType:@"jpg"];NSString* imagebbPath = [bundle pathForResource:@"imagebb"ofType:@"jpg" inDirectory:@"imagesb"];

////////

iOSAndroid都提供了有關(guān)webview和javascript通訊的功能,這就使開發(fā)者根據(jù)手機的系統(tǒng)展示適合手機的界面蜀备,是界面開發(fā)更加簡單关摇。
我的原型主要實現(xiàn)通過UIWebView展示本地的html、css碾阁、javascript文件输虱,并且和ios互相通訊,用來展示數(shù)據(jù)脂凶。
下面是我實現(xiàn)的一個簡單demo宪睹,界面效果如下:


點擊連接調(diào)用ios中的提醒功能:
image
image

實現(xiàn)過程:
首先創(chuàng)建一個工程,ipad.web1蚕钦,編譯運行成功亭病。
實現(xiàn)webview的代碼:

import <UIKit/UIKit.h>

@interface ipad_web1ViewController : UIViewController <UIWebViewDelegate>{ IBOutlet UIWebView *myWebView; } @property (nonatomic,retain) UIWebView *myWebView; @end

相應(yīng)的.m文件:

import "ipad_web1ViewController.h"

@implementation ipad_web1ViewController @synthesize myWebView; - (void)viewDidLoad { [super viewDidLoad]; self.myWebView.delegate=self; **NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; [myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath: path]]]; **} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; }

  • (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; }
  • (void)viewDidUnload { self.myWebView=nil; }
  • (void)dealloc { [self.myWebView release]; [super dealloc]; } #pragma mark – #pragma mark UIWebViewDelegate - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType { ** if ( [request.mainDocumentURL.relativePath isEqualToString:@"/click/false"] ) { NSLog( @"not clicked" ); return false; } if ( [request.mainDocumentURL.relativePath isEqualToString:@"/click/true"] ) { //the image is clicked, variable click is true NSLog( @"image clicked" ); UIAlertView alert=[[UIAlertView alloc]initWithTitle:@"JavaScript called" message:@"You’ve called iPhone provided control from javascript!!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; return false; } return true; **} - (void)webViewDidStartLoad:(UIWebView *)webView { NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; NSLog(@"title11=%@",title); } - (void)webViewDidFinishLoad:(UIWebView *)webView { **NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; NSLog(@"title=%@",title); ** //添加數(shù)據(jù) **[myWebView stringByEvaluatingJavaScriptFromString:@"var field = document.getElementById('field_2');" "field.value='Multiple statements - OK';"]; ** //[myWebView stringByEvaluatingJavaScriptFromString:@"var script = document.createElement('script');" // "script.type = 'text/javascript';" // "script.text = "function myFunction() { " // "var field = document.getElementById('field_3');" // "field.value='Calling function - OK';" // "}";" // "document.getElementsByTagName('head')[0].appendChild(script);"]; // // [myWebView stringByEvaluatingJavaScriptFromString:@"myFunction();"]; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { } @end

最后在Interface Builder中添加UIwebView控件,并且和相應(yīng)的實體相關(guān)聯(lián)冠桃。

*NSString title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; NSLog(@"title=%@",title);

主要是獲取html文件的title名字命贴。
[myWebView stringByEvaluatingJavaScriptFromString:@"var field = document.getElementById('field_2');" "field.value='Multiple statements - OK';"];

添加相應(yīng)的表單信息道宅。
接下來添加index.html文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>How to build an iPhone website</title> <meta name="author" content="will" /> <meta name="copyright" content="copyright 2008 www.engageinteractive.co.uk" /> <meta name="description" content="Welcome to engege interactive on the iPhone!" /> <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;"> <link rel="apple-touch-icon" href="images/template/engage.png"/> <style type="text/css"> **@import url("layout.css"); ** </style> <script type="text/javascript" src="test.js"></script> </head> <body> <h1>測試</h1> <center><a href="javascript:void(0)" onMouseDown="imageClicked()">click me</a></center> <form> <input id="field_1" type="text" name="value" />


<input id="field_2" type="text" name="value" />


<input id="field_3" type="text" name="value" />


</form> </body> </html>

添加相應(yīng)的css文件:

body { background-color: #F2F5A9; }

添加相應(yīng)的js文件:

function imageClicked(){ var clicked=true; window.location="/click/"+clicked; }

運行食听,點擊連接應(yīng)該不出相應(yīng)的對話框,說明相應(yīng)的javascript沒有生效污茵。修改辦法是打開targets樱报,點擊ipad.web1,移動相應(yīng)的test.js文件到下圖即可泞当。

源代碼:http://easymorse-iphone.googlecode.com/svn/trunk/ipad.web1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迹蛤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盗飒,老刑警劉巖嚷量,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逆趣,居然都是意外死亡蝶溶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門宣渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖所,“玉大人,你說我怎么就攤上這事痕囱√镌” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵鞍恢,是天一觀的道長傻粘。 經(jīng)常有香客問我,道長帮掉,這世上最難降的妖魔是什么抹腿? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮旭寿,結(jié)果婚禮上警绩,老公的妹妹穿的比我還像新娘。我一直安慰自己盅称,他們只是感情好肩祥,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缩膝,像睡著了一般混狠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疾层,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天将饺,我揣著相機與錄音,去河邊找鬼痛黎。 笑死予弧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湖饱。 我是一名探鬼主播掖蛤,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼井厌!你這毒婦竟也來了蚓庭?” 一聲冷哼從身側(cè)響起致讥,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎器赞,沒想到半個月后垢袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡港柜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年惶桐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潘懊。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡姚糊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出授舟,到底是詐尸還是另有隱情救恨,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布释树,位于F島的核電站肠槽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奢啥。R本人自食惡果不足惜秸仙,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桩盲。 院中可真熱鬧寂纪,春花似錦、人聲如沸赌结。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柬姚。三九已至拟杉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間量承,已是汗流浹背搬设。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撕捍,地道東北人拿穴。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像卦洽,于是被迫代替她去往敵國和親贞言。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • IOS之UIWebView的使用 剛接觸IOS開發(fā)1年多阀蒂,現(xiàn)在對于 混合式 移動端開發(fā)越來越流行该窗,因為開發(fā)成本上、...
    學(xué)無止境666閱讀 45,790評論 5 53
  • OS之UIWebView的使用 剛接觸IOS開發(fā)1年多蚤霞,現(xiàn)在對于 混合式 移動端開發(fā)越來越流行酗失,因為開發(fā)成本上、速...
    知之未道閱讀 1,659評論 0 4
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會牽扯到網(wǎng)絡(luò)開發(fā)昧绣,例如說新浪微博规肴、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 3,661評論 2 7
  • 一夜畴、 WebView簡單介紹 WebView是iOS中比較常用的一個控件,特別是現(xiàn)在app不好推廣,下載成本高的時...
    Onegeng閱讀 13,623評論 1 11
  • 金虎拖刃,是個七歲的小男孩,虎頭虎腦的贪绘,特別可愛兑牡。是我們稀有血型愛心之家,每位成員都很熟悉的小天使税灌。只是均函,這樣一個惹人...
    April505075閱讀 828評論 0 1