首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI : WKWebView有没有办法在WKWebView加载完成后调用函数?

在SwiftUI中,可以使用WKWebView来加载网页内容。要在WKWebView加载完成后调用函数,可以通过WKNavigationDelegate来实现。

首先,需要创建一个自定义的WKWebViewWrapper,用于包装WKWebView,并设置其navigationDelegate为自身。然后,在WKWebViewWrapper中实现WKNavigationDelegate的相关方法。

以下是一个示例代码:

代码语言:txt
复制
import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        WebView(url: "https://www.example.com")
    }
}

struct WebView: UIViewRepresentable {
    let url: String
    
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.navigationDelegate = context.coordinator
        webView.load(URLRequest(url: URL(string: url)!))
        return webView
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        // 更新视图
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, WKNavigationDelegate {
        let parent: WebView
        
        init(_ parent: WebView) {
            self.parent = parent
        }
        
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            // 在WKWebView加载完成后调用函数
            parent.webViewDidFinishLoading()
        }
    }
    
    func webViewDidFinishLoading() {
        // 在加载完成后执行的函数
        print("WebView加载完成")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在上述代码中,我们创建了一个名为WebView的UIViewRepresentable,用于在SwiftUI中使用WKWebView。在makeUIView方法中,我们创建了一个WKWebView,并设置其navigationDelegate为自身。在Coordinator类中,我们实现了WKNavigationDelegate的webView(_:didFinish:)方法,在WKWebView加载完成后调用了父视图的webViewDidFinishLoading函数。

这样,当WKWebView加载完成后,会调用webViewDidFinishLoading函数,你可以在该函数中执行你想要的操作。

推荐的腾讯云相关产品:腾讯云移动浏览器网页开发服务(https://cloud.tencent.com/product/mbs)

请注意,以上答案仅供参考,具体实现方式可能因不同的需求和场景而有所变化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hybrid App 应用 开发中 9 个必备知识点复习(WebView 调试 等)

解决办法: 借助 WKNavigtionDelegate 当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们函数里执行[webView reload]...检测 webView.title 是否为空 并不是所有 H5 页面白屏的时候都会调用上面的回调函数,比如,最近遇到一个高内存消耗的 H5 页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象...解决办法: 由于 WKWebView 独立进程里执行网络请求。...9. goBack API问题 WKWebView调用 -[WKWebView goBack], 回退到上一个页面后不会触发window.onload() 函数、不会执行JS。 10....Step over next function call:执行到下一步的函数调用(跳到下一行)。 Step into next function call:进入当前函数

3.1K00

【Hybrid】288- Hybrid App 应用开发中 9 个必备知识点复习

解决办法: 借助 WKNavigtionDelegate 当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们函数里执行 [webView reload](这个时候...解决办法: 由于 WKWebView 独立进程里执行网络请求。...解决办法: 无奈之下,我们只能约定一个JS接口,让游戏开发商实现该接口,具体是通过 canvas getImageData()方法取得图片数据后返回 base64 格式的数据,客户端需要截图的时候,调用这个...9. goBack API问题 WKWebView调用 -[WKWebViewgoBack], 回退到上一个页面后不会触发 window.onload() 函数、不会执行JS。 10....Stepovernextfunctioncall:执行到下一步的函数调用(跳到下一行)。 Stepintonextfunctioncall:进入当前函数

2.3K20
  • Hybrid App 应用开发中 9 个必备知识点复习

    解决办法: 借助 WKNavigtionDelegate 当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数,我们函数里执行 [webView reload](这个时候...解决办法: 由于 WKWebView 独立进程里执行网络请求。...解决办法: 无奈之下,我们只能约定一个JS接口,让游戏开发商实现该接口,具体是通过 canvas getImageData()方法取得图片数据后返回 base64 格式的数据,客户端需要截图的时候,调用这个...9. goBack API问题 WKWebView调用 -[WKWebViewgoBack], 回退到上一个页面后不会触发 window.onload() 函数、不会执行JS。 10....Stepovernextfunctioncall:执行到下一步的函数调用(跳到下一行)。 Stepintonextfunctioncall:进入当前函数

    2.3K30

    NSURLProtocol 对 WKWebView 的处理

    各种 UIWebView 的问题没有了,速度更快了,占用内存少了,一句话,WKWebView 是 App 内部加载网页的最佳选择!...拉下代码直接搜索 NSURLProtocol,看看有没有有关的信息 看来的确是有和 NSURLProtocol 有关系,后面通过断点的调用栈中也找到了 + [NSURLProtocol canInitWithRequest...:] 这样的字样,再通过网上查一些资料也证实了我的猜想,其实 WKWebview 一开始时候是会调用到 NSURLProtocol 中的入口方法 canInitWithRequest 的,但是就没有然后了...custom 字符串) 通过这个可以猜想,WKWebview 并不是不走 NSURLProtocol,而是需要满足他的一个规则,他才会在入口函数这里返回 YES 来给你放行,这个规则便是你所请求的 URL...CustomProtocol 之后调用该方法应该就可以了。

    1.4K30

    技术 | Hybrid载体的变化(一)

    初始化WKWebView时你还需要配置一个Conf,这个Conf中你可以添加一个属性,这个属性JavaScript这一边你可以通过window.webkit.messageHandlers.icepyApp...“evaluateJavaScript”方法注入就好,唯一的优势是在于,发送的消息可以先转成JSON,然后字符串化当参数传入到一个函数里,而你的函数真实接收到的是一个对象,而不是字符串,这就是WKWebView...辅助我们做了很多这样的类型转换的事情,如果是UIWebView就没有这么方便的办法了。...{ // 页面开始加载调用 } func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)...,说到页面加载完成时间肯定是从didStart开始经过didCommit最后didFinish的累加,这个时间不是渲染时间,渲染时间客户端上是很难统计的,我的建议是做一个JS-API,让Web应用主动的提供渲染完成时间

    86630

    WKWebView 白屏问题

    1、WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。... WKWebView加载下面的测试链接可以稳定重现白屏现象: http://people.mozilla.org/~rnewman/fennec/mem.html 这个时候 WKWebView.URL...:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0)); 当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数...B、检测 webView.title 是否为空 并不是所有H5页面白屏的时候都会调用上面的回调函数,比如,最近遇到一个高内存消耗的H5页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象...(拍照过程消耗了大量内存,导致内存紧张,WebContent Process 被系统挂起),但上面的回调函数并没有被调用

    4.4K20

    WKWebView 那些坑

    WKWebView加载下面的测试链接可以稳定重现白屏现象: http://people.mozilla.org/~rnewman/fennec/mem.html 这个时候 WKWebView.URL...:(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0)); 当 WKWebView 总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数...B、检测 webView.title 是否为空 并不是所有H5页面白屏的时候都会调用上面的回调函数,比如,最近遇到一个高内存消耗的H5页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象...(拍照过程消耗了大量内存,导致内存紧张,WebContent Process 被系统挂起),但上面的回调函数并没有被调用。...8.2、goBack API问题 WKWebView调用 -[WKWebView goBack], 回退到上一个页面后不会触发window.onload()函数、不会执行JS。

    4.6K130

    WKWebView 那些坑

    :(WKWebView *)webView API_AVAILABLE(macosx(10.11), ios(9.0)); 当WKWebView总体内存占用过大,页面即将白屏的时候,系统会调用上面的回调函数...1.2、检测webView.title是否为空 并不是所有页面白屏的时候都会调用上面的回调函数,比如,最近遇到一个高内存消耗的H5页面上present系统相机,拍照完毕后返回原来页面的时候出现白屏现象...(拍照过程消耗了大量内存,导致内存紧张,webContent process被系统挂起),但上面的回调函数并没有被调用。...当然,由于每一次页面跳转前都会调用回调函数: - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction...8.2、goBack API问题 WKWebView调用 -[WKWebView goBack], 回退到上一个页面后不会触发window.onload()函数、不会执行JS。

    17.3K21

    iOS的WebView——WKWebView

    WKNavigationDelegate 如命名,这个是WKWebView的导航的代理。它控制了WKWebView加载一个页面流程中的各个关键时间节点的。...#pragma mark - WKNavigationDelegate // 页面开始加载调用 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation...:(WKNavigation *)navigation{ NSLog(@"页面开始加载"); } // 当内容开始返回时调用 - (void)webView:(WKWebView *)webView...:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ NSLog(@"页面完成加载"); } // 页面加载失败时调用...拦截url 此方法的本质是,js会尝试加载某个URL,客户端加载前拦截这个URL,通过解析这个URL识别它的内容,调用相应的原生方法,并阻上浏览器加载这个URL。

    3.5K20

    分享超详细 WKWebView 开发和使用经验

    readAccessURL 参数:允许访问的资源路径,如果是 Bundle 中加载本地 HTML,则需要设置该 HTML 所在的 Bundle 路径,路径设置好后,该目录在 WKWebView 中被视为沙盒目录...更改前的值 // NSKeyValueObservingOptionInitial 观察初始化的值(注册观察服务时会调用一次触发方法) // NSKeyValueObservingOptionPrior...javaScriptCanOpenWindowsAutomatically: 允许使用 js 自动打开 Window,默认不允许,js 调用 window.open 方法的时候,必须将改值设置为 YES...httpCookieStore setCookie:cookie ...]; [wk loadRequest:...]; 内容渲染控制 suppressesIncrementalRendering 是否等待 H5 内容全部加载完成后才开始渲染画面...didCommitNavigation,网络请求加载完成后执行。

    4.9K30

    UI篇- UIWebView使用大全

    OC中调用JS方法 与UIWebView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义转义字符前加\),传递json字符串时不需要加单引号或双引号:...有两种方式可根据加载内容 获取UIWebView的合适高度,但都需要在网页内容加载完成后才可以,即需要在webViewDidFinishLoad回调中使用。...这里解决的方法是通过使用 WKWebView 的方法。...UIWebView iOS11中的使用。 ? UIWebView iOS 11上 当顶部的 y值设为 0 时,是依然无法盖住UIStatusBar区域的,但是滚动时就会出现问题了。...解决办法:UIWebView 初始化的时候Frame里面的y值设置为 20,这样就不会出现UIStatusBar和内容重叠的问题了。 20.

    2K10

    WKWebView的使用

    示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1、WKWebView涉及的一些类 2、WKWebView涉及的代理方法 3、网页内容加载进度条的实现 4、JS...后,会发现字体小了很多,这应该是WKWebView与html的兼容问题,解决办法是修改原网页,要么我们手动注入JS NSString *jSString = @"var meta = document.createElement...涉及的代理方法 WKNavigationDelegate :主要处理一些跳转、加载处理操作 // 页面开始加载调用 - (void)webView:(WKWebView *)webView...didStartProvisionalNavigation:(WKNavigation *)navigation { } // 页面加载失败时调用 - (void)webView:(WKWebView...- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { } // 页面加载完成之后调用

    2.9K61
    领券