WebView的基本使用
1 概念性知識
01 webView是有缺點(diǎn)的划提,會導(dǎo)致內(nèi)存泄露队询,而且這個問題是它系統(tǒng)本身的問題拳话。
02 手機(jī)上面的safai其實(shí)就是用webView來實(shí)現(xiàn)的
03 現(xiàn)在的開發(fā)并不完全是原生的開發(fā)都许,而更加傾向于原生+Html5的方式
04 webView是OC代碼和html代碼之間進(jìn)行交互的橋梁
2 代碼相關(guān)
/*A*網(wǎng)頁操控相關(guān)方法**/
[self.webView goBack]; 回退
[self.webView goForward]; 前進(jìn)
[self.webView reload]; 刷新
//設(shè)置是否能夠前進(jìn)和回退
self.goBackBtn.enabled = webView.canGoBack;
self.fowardBtn.enabled = webView.canGoForward;
/*B*常用的屬性設(shè)置**/
self.webView.scalesPageToFit = YES; 設(shè)置網(wǎng)頁自動適應(yīng)
self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 設(shè)置檢測網(wǎng)頁中的格式類型,all表示檢測所有類型包括超鏈接翩肌、電話號碼突照、地址等沟绪。
self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
/*C*相關(guān)代理方法**/
//每當(dāng)將加載請求的時候調(diào)用該方法,返回YES 表示加載該請求褪秀,返回NO 表示不加載該請求
//可以在該方法中攔截請求
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
return ![request.URL.absoluteString containsString:@"dushu"];
}
//開始加載網(wǎng)頁蓄诽,不僅監(jiān)聽我們指定的請求,還會監(jiān)聽內(nèi)部發(fā)送的請求
-(void)webViewDidStartLoad:(UIWebView *)webView
//網(wǎng)頁加載完畢之后會調(diào)用該方法
-(void)webViewDidFinishLoad:(UIWebView *)webView
//網(wǎng)頁加載失敗調(diào)用該方法
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
/*D*其它知識點(diǎn)-加載本地資源**/
NSURL *url = [[NSBundle mainBundle] URLForResource:@"text.html" withExtension:nil];
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
8 HTML
1.Html決定網(wǎng)頁的內(nèi)容媒吗,css決定網(wǎng)頁的樣式仑氛,js決定網(wǎng)頁的事件
2.html學(xué)習(xí)網(wǎng)站:http://www.w3school.com.cn
9 OC和JS代碼的互調(diào)
01 OC調(diào)用JS的代碼
NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"sum()"];
02 JS怎么調(diào)用OC的說明
新的需求:點(diǎn)擊按鈕的時候撥打電話
但是我在點(diǎn)擊按鈕的時候,用戶是不知道的,我們怎么能夠知道用戶點(diǎn)擊了網(wǎng)頁上面的一個按鈕锯岖,只能通過一個技巧介袜,那就是自己搞一個特定的協(xié)議頭比如說xmg://,當(dāng)我攔截到你的網(wǎng)絡(luò)請求的時候,只需要判斷一下當(dāng)前的協(xié)議頭是不是這個就能判斷你現(xiàn)在是否是JS調(diào)用出吹。
OC里面有通過字符串生成SEL類型的方法遇伞,所以當(dāng)拿到數(shù)據(jù)之后做下面的事情
1)截取方法的名稱
2)將截取出來的字符串轉(zhuǎn)換為SEL
3)利用performSelect方法來調(diào)用SEL
03 涉及到的相關(guān)方法
[@"abc" hasPrefix:@"A"] //判斷字符串是否以一個固定的字符開頭,這里為A
//截串操作
- (NSString *)substringFromIndex:(NSUInteger)from;
//切割字符串捶牢,返回一個數(shù)組
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
//替換操作
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
//把string包裝成SEL
SEL selector = NSSelectorFromString(sel);
04 如何屏蔽警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
//-Warc-performSelector-leaks為唯一的警告標(biāo)識
[self performSelector:selector withObject:nil];
#pragma clang diagnostic pop
10 NSInvocation的基本使用
//封裝invacation可以調(diào)用多個參數(shù)的方法
-(void)invacation
{
//1.創(chuàng)建一個MethodSignature鸠珠,簽名中保存了方法的名稱,參數(shù)和返回值
//這個方法屬于誰叫确,那么就用誰來進(jìn)行創(chuàng)建
//注意:簽名一般是用來設(shè)置參數(shù)和獲得返回值的跳芳,和方法的調(diào)用沒有太大的關(guān)系
NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];
/*注意不要寫錯了方法名稱
// NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)];
*/
//2.通過MethodSignature來創(chuàng)建一個NSInvocation
//NSInvocation中保存了方法所屬于的對象|方法名稱|參數(shù)|返回值等等
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
/*2.1 設(shè)置invocation,來調(diào)用方法*/
invocation.target = self;
// invocation.selector = @selector(call);
// invocation.selector = @selector(callWithNumber:);
// invocation.selector = @selector(callWithNumber:andContext:);
invocation.selector = @selector(callWithNumber:andContext:withStatus:);
NSString *number = @"10086";
NSString *context = @"下課了";
NSString *status = @"睡覺的時候";
//注意:
//1.自定義的參數(shù)索引從2開始竹勉,0和1已經(jīng)被self and _cmd占用了
//2.方法簽名中保存的方法名稱必須和調(diào)用的名稱一致
[invocation setArgument:&number atIndex:2];
[invocation setArgument:&context atIndex:3];
[invocation setArgument:&status atIndex:4];
/*3.調(diào)用invok方法來執(zhí)行*/
[invocation invoke];
}
11 異常處理
01 一般處理方式:
a.app異常閃退飞盆,那么捕獲crash信息,并記錄在本地沙盒中次乓。
b.當(dāng)下次用戶重新打開app的時候吓歇,檢查沙盒中是否保存有上次捕獲到的crash信息。
c.如果有那么利用專門的接口發(fā)送給服務(wù)器票腰,以求在后期版本中修復(fù)城看。
02 如何拋出異常
//拋出異常的兩種方式
// @throw [NSException exceptionWithName:@"好大一個bug" reason:@"異常原因:我也不知道" userInfo:nil];
//方式二
NSString *info = [NSString stringWithFormat:@"%@方法找不到",NSStringFromSelector(aSelector)];
//下面這種方法是自動拋出的
[NSException raise:@"這是一個異常" format:info,nil];
03 如何捕獲異常
NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
void UncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];//得到當(dāng)前調(diào)用棧信息
NSString *reason = [exception reason];//非常重要,就是崩潰的原因
NSString *name = [exception name];//異常類型
NSString *errorMsg = [NSString stringWithFormat:@"當(dāng)前調(diào)用棧的信息:%@\nCrash的原因:%@\n異常類型:%@\n",arr,reason,name];
//把該信息保存到本地沙盒杏慰,下次回傳給服務(wù)器测柠。
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者