【iOS開發(fā)】WKWebView學(xué)習(xí)筆記(3)-WKUIDelegate

WKUIDelegate從名稱能看出它是webView在user interface上的代理,共有5個(gè)可選類型的代理方法。它為webView提供了原生的彈框,而不是JavaScript里的提示框。
雖然JavaScript的提示框可以做的跟原生一樣,但是對于ios開發(fā)者來說,如果要更改提示框就不方便了。提供這個(gè)代理,可以讓ios端更加靈活的修改提示框的樣式。
js中有三種提示框:Alert,Confirm,prompt對應(yīng)到該代理如下:

/*  警告 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    [[[UIAlertView alloc] initWithTitle:@"警告框" message:message delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];
    completionHandler();
}
///** 確認(rèn)框 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
    [[[UIAlertView alloc] initWithTitle:@"確認(rèn)框" message:message delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];

    completionHandler(1);
}
/**  輸入框 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
    [[[UIAlertView alloc] initWithTitle:@"輸入框" message:prompt delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];
 completionHandler(@"你是誰!");
}

看下效果:


![Snip20160906_8.png](http://upload-images.jianshu.io/upload_images/2854558-90630048e0c51670.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

除了上面的三個(gè)方法我們發(fā)現(xiàn)還有兩個(gè)代理方法沒用用到。

// 創(chuàng)建新的webView
// 可以指定配置對象、導(dǎo)航動作對象、window特性。如果沒用實(shí)現(xiàn)這個(gè)方法,不會加載鏈接,如果返回的是原webview會崩潰。
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
// webview關(guān)閉時(shí)回調(diào)
- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);

要調(diào)用下面的方法是有條件的

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;

WKNavigationDelegate中的該方法是用戶點(diǎn)擊網(wǎng)頁上的鏈接,需打開新頁面時(shí),將先調(diào),是否允許跳轉(zhuǎn)到鏈接。

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
 WKFrameInfo *sFrame = navigationAction.sourceFrame;//navigationAction的出處
 WKFrameInfo *tFrame = navigationAction.targetFrame;//navigationAction的目標(biāo)
//只有當(dāng)  tFrame.mainFrame == NO;時(shí),表明這個(gè) WKNavigationAction 將會新開一個(gè)頁面。
//才會調(diào)用- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
}

但是新開一個(gè)webView。如果我們只是顯示網(wǎng)頁,就感覺這么做耗性能,沒有必要。

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
  WKFrameInfo *frameInfo = navigationAction.targetFrame;
  if (![frameInfo isMainFrame]) {
      [webView loadRequest:navigationAction.request];
  }
    return nil;
}

參考鏈接:http://www.itdecent.cn/p/3a75d7348843 (WKWebView遇到_blank的處理方法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容