Mac OS Swift UI 中使用WKWebView,以及实现代理

这篇具有很好参考价值的文章主要介绍了Mac OS Swift UI 中使用WKWebView,以及实现代理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目配置

首先进行项目配置,支持入网
​​​​​​​​swiftui wkwebview,Swift UI,Mac OS,swift,ui,webview
swiftui wkwebview,Swift UI,Mac OS,swift,ui,webview

包装webView

首先为了能在Swift UI中使用WebView,应该对其进行包装

struct WebView: NSViewRepresentable {

    let webView: WKWebView

    func makeNSView(context: Context) -> WKWebView { return webView }
    
    func updateNSView(_ nsView: WKWebView, context: Context) { }
}

实现代理

class WebViewNavigationDelegate: NSObject, WKNavigationDelegate {
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        // TODO
        decisionHandler(.allow)
    }

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        // TODO
        decisionHandler(.allow)
    }
    
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        
    }
    
    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        
    }
}

自定义webView

观察网页在什么时候需要前进或者后退,这个时候要用ObservableObject来进行包装

class CustomWebView: ObservableObject {
    let webView: WKWebView

    private let navigationDelegate: WebViewNavigationDelegate

    init() {
        let configuration = WKWebViewConfiguration()
        configuration.websiteDataStore = .nonPersistent()
        webView = WKWebView(frame: .zero, configuration: configuration)
        navigationDelegate = WebViewNavigationDelegate()

        webView.navigationDelegate = navigationDelegate
        setupBindings()
    }

    @Published var urlString: String = "https://www.csdn.net/"
    @Published var canGoBack: Bool = false
    @Published var canGoForward: Bool = false
    @Published var isLoading: Bool = false

    private func setupBindings() {
        webView.publisher(for: \.canGoBack)
            .assign(to: &$canGoBack)

        webView.publisher(for: \.canGoForward)
            .assign(to: &$canGoForward)

        webView.publisher(for: \.isLoading)
            .assign(to: &$isLoading)

    }

    func loadUrl() {
        guard let url = URL(string: urlString) else {
            return
        }

        webView.load(URLRequest(url: url))
    }

    func goForward() {
        webView.goForward()
    }

    func goBack() {
        webView.goBack()
    }
}

调试

现在,可以将它放到contentView中调试

struct ContentView: View {
    
    @StateObject var model = CustomWebView()
    
    var body: some View {
        ZStack(alignment: .bottom) {
            Color.black
                .ignoresSafeArea()
            
            VStack(spacing: 0) {
                HStack(spacing: 10) {
                    HStack {
                        TextField("Input an url",
                                  text: $model.urlString)
                            .disableAutocorrection(true)
                            .padding(10)
                        Spacer()
                    }
                    .background(Color.white)
                    .cornerRadius(30)
                    
                    Button("Go", action: {
                        model.loadUrl()
                    })
                    .foregroundColor(.blue)
                    .padding(10)
                    
                }.padding(10)
                
                ZStack {
                    WebView(webView: model.webView)
                    
                    if model.isLoading {
                        ProgressView()
                            .progressViewStyle(CircularProgressViewStyle())
                    }
                }
            }
        }
        .toolbar {
            ToolbarItemGroup(placement: .navigation) {
                Button(action: {
                    model.goBack()
                }, label: {
                    Image(systemName: "arrowshape.turn.up.backward")
                })
                .disabled(!model.canGoBack)
                
                Button(action: {
                    model.goForward()
                }, label: {
                    Image(systemName: "arrowshape.turn.up.right")
                })
                .disabled(!model.canGoForward)
                
                Spacer()
            }
        }
    }
}

最终效果

swiftui wkwebview,Swift UI,Mac OS,swift,ui,webview文章来源地址https://www.toymoban.com/news/detail-631797.html

到了这里,关于Mac OS Swift UI 中使用WKWebView,以及实现代理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 7、NCL安装与配置(Windows、mac OS以及Linux)

             NCL(The NCAR Command Language)是一种专门为科学数据处理以及数据可视化设计的高级语言,被广泛应用在大气科学以及海洋科学等学科的研究中。本文主要讲解如何在Windows、mac OS以及Linux操作系统下快速、正确地安装NCL并进行环境配置。 目前,Windows系统下NCL主流安装方

    2024年02月02日
    浏览(43)
  • swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)

    我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适用于 Xcode beta 4,但适用于

    2024年02月14日
    浏览(40)
  • 个人使用mac OS和win OS的差异

    苹果 macOS 操作系统和 Windows 操作系统在很多方面有所不同,主要体现在以下几个方面: 用户界面:macOS 和 Windows 的用户界面风格不同。macOS 推崇简洁、优雅的设计,注重操作体验;Windows 软件更为丰富,但是比较杂乱。 文件系统:macOS 的文件系统采用 HFS+ 格式并支持 APFS 格

    2023年04月13日
    浏览(40)
  • swift UI 和UIKIT 如何配合使用

    SwiftUI和UIKit可以在同一个iOS应用程序中配合使用。它们是两个不同的用户界面框架,各自有自己的优势和特点。在现实开发中,很多iOS应用程序并不是一开始就完全采用SwiftUI或UIKit,而是根据需要逐步引入SwiftUI或者使用两者共存。 SwiftUI的优势: 声明式UI:SwiftUI是一个全新的

    2024年01月18日
    浏览(41)
  • SwiftUI——如何使用新的NavigationStack和NavigationSplitView(如何页面跳转2.0以及如何制作侧栏)

    从 iOS 16 开始,苹果开始弃用原先的 NavigationView ,以后会逐渐完全淘汰掉。现在开始使用 NavigationStack 和 NavigationSplitView 。 NavigationStack 的效果和原本的 NavigationView 一样,而 NavigationSplitView 则和现在 iPadOS 上的 NavigationView 效果一样。 最近在 iPadOS 上面使用 NavigationView ,内容会

    2024年02月04日
    浏览(33)
  • 在Swift UI中使用相对坐标简化Shape绘制

    Swift UI 提供了一些内置的基本形状,如矩形,圆角矩形,圆和椭圆等。 实际开发过程中,这些形状远远不够,需要增加新的定制形状,比如,三角形,或者复杂一点的水滴形状等。 要增加新的自定义形状,只要实现SwiftUI 提供Shape协议即可。下面是自定义一个三角形的例子:

    2024年03月16日
    浏览(44)
  • 【OpenCV】在 Mac OS 上使用 EmguCV

    前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS。 Emgu CV是OpenCV图像处理库的跨平台 .Net 包装器。允许从 .NET 兼容语言调用OpenCV函数。但是网上目前关于在Mac OS上使用E

    2024年02月03日
    浏览(31)
  • Mac OS 使用远程桌面登录服务器

    以下操作以 Microsoft Remote Desktop for Mac 为例。微软官方已于2017年停止提供 Remote Desktop 客户端的下载链接,转由其子公司 HockeyApp 进行 Beta 版本的发布。您可前往 Microsoft Remote Desktop Beta 下载 Beta 版本 Microsoft Remote Desktop Beta 在 “PC name” 处输入实例公网 IP。 单击其余选项保持默

    2024年02月07日
    浏览(33)
  • 【OpenCV】在Mac OS上使用EmguCV

    前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS。 Emgu CV是OpenCV图像处理库的跨平台 .Net 包装器。允许从 .NET 兼容语言调用OpenCV函数。但是网上目前关于在Mac OS上使用E

    2024年01月22日
    浏览(37)
  • Swift 中的 Actors 使用以及如何防止数据竞争

    Actors 是 Swift 5.5 引入的一种并发编程模型,用于管理共享数据并提供数据访问的安全性。Actors 使用异步消息传递来保护数据,防止数据竞争和其他并发问题。在这篇回答中,我将解释 Actors 的基本原理,并提供一些示例代码来说明其用法和如何防止数据竞争。 Swift 中的 Acto

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包