• WKWebView使用


    WKWebView比之之前使用的UIWebView更加具有优势,UIWebView更加的笨重,UIWebView占用更多的内存,且内存的峰值更加的夸张,WKWebView加载的速度也更快,而且其更多的支持HTML5的特性,官方宣称的高达60fps的公洞刷新率以及内置的手势。

    以下是一些WKWebView的一些使用方法及代理方法

    加载链接和UIWebView类似

    懒加载方法:

    - (WKWebView *)webView {
        if (_webView == nil) {
            // js配置
            WKUserContentController *userContentController = [[WKUserContentController alloc] init];
            [userContentController addScriptMessageHandler:self name:@"webViewLoadStart"];
            [userContentController addScriptMessageHandler:self name:@"webViewLoadFinish"];
            [userContentController addScriptMessageHandler:self name:@"webViewLogout"];
            [userContentController addScriptMessageHandler:self name:@"webViewSuccess"];

            // WKWebView的配置
            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
            configuration.userContentController = userContentController;
            
            // 显示WKWebView
            _webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
            _webView.UIDelegate = self; // 设置WKUIDelegate代理
            _webView.navigationDelegate = self; // 设置WKNavigationDelegate代理
            [self.view addSubview:_webView];
        }
        return _webView;
    }

    在其中的

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message方法中主要是收到JS的回执脚本就会运行一次

    可以在这个方法里面进行app和js的交互

    下面是WKUIDelegate一些代理的方法,可以用于输入框,弹出窗的使用

    和UIWebView类似的加载,成功,失败的代理方法类似

    /// 1 页面开始加载
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
    /// 2 开始获取到网页内容时返回
    - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
    /// 3 页面加载完成之后调用
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
    /// 4 页面加载失败时调用
    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;

    #pragma mark - WKUIDelegate
    #pragma mark alert弹出框
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
        NSLog(@"%s", __FUNCTION__);
        // 确定按钮
        UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            completionHandler();
        }];
        // alert弹出框
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:alertAction];
        [self presentViewController:alertController animated:YES completion:nil];
    }

    #pragma mark Confirm选择框
    - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(nonnull NSString *)message initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(BOOL))completionHandler {
        NSLog(@"%s", __FUNCTION__);
        // 按钮
        UIAlertAction *alertActionCancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            // 返回用户选择的信息
            completionHandler(NO);
        }];
        UIAlertAction *alertActionOK = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            completionHandler(YES);
        }];
        // alert弹出框
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];
        [alertController addAction:alertActionCancel];
        [alertController addAction:alertActionOK];
        [self presentViewController:alertController animated:YES completion:nil];
    }

    #pragma mark TextInput输入框
    - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(nonnull NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(NSString * _Nullable))completionHandler {
        NSLog(@"%s",__FUNCTION__);
        // alert弹出框
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:nil preferredStyle:UIAlertControllerStyleAlert];
        // 输入框
        [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
            textField.placeholder = defaultText;
        }];
        // 确定按钮
        [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            // 返回用户输入的信息
            UITextField *textField = alertController.textFields.firstObject;
            completionHandler(textField.text);
        }]];
        // 显示
        [self presentViewController:alertController animated:YES completion:nil];
    }

  • 相关阅读:
    ES6:Iterator遍历器
    前端:对BFC的理解
    前端:性能优化之防抖与节流
    ES6新增数据类型Symbol
    ajax和fetch、aixos的区别
    我对js数据类型的理解和深浅(copy)的应用场景
    egg的基本使用
    前端:css3的过渡与动画的基础知识
    Java基础篇之类
    JAVA基础篇之Scanner
  • 原文地址:https://www.cnblogs.com/Acee/p/5305535.html
Copyright © 2020-2023  润新知