MacOS 项目中未声明的类型“UIViewRepresentable”

Vic*_*rov 1 swiftui

我创建了 macOS 项目,并尝试使 UIViewRepresentable 成为可能,但出现此错误。

import SwiftUI

struct WebView: UIViewRepresentable { //Error: Use of undeclared type 'UIViewRepresentable'
}
Run Code Online (Sandbox Code Playgroud)

我可以用它做什么,或者如何为 macOS 制作自己的 UIViewRepresentable 以在我的项目中使用 WKWebView?

struct WebView: UIViewRepresentable {
    func makeUIView(context: Context) -> WKWebView {
        WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
    }
}
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 8

UI... 总是指 UIKit。

对于 macOS,您必须使用NSViewRepresentable


Moj*_*ini 7

您可以实现以下代码。然后Xcode将帮助您为相应的目标实现正确的协议:

#if os(macOS)
public typealias ViewRepresentable = NSViewRepresentable
#elseif os(iOS)
public typealias ViewRepresentable = UIViewRepresentable
#endif
Run Code Online (Sandbox Code Playgroud)

macOS 目标

苹果


iOS 目标

iOS系统


此外,您可以在一个结构中同时拥有两种实现,例如:

struct WebView: ViewRepresentable {
    func makeNSView(context: Context) -> WKWebView { WKWebView() }
    func makeUIView(context: Context) -> WKWebView { WKWebView() }
    func updateNSView(_ nsView: WKWebView, context: Context) { }
    func updateUIView(_ nsView: WKWebView, context: Context) { }
}
Run Code Online (Sandbox Code Playgroud)

自动的

如果您想要一个在两个平台上都能工作的简单实现,请查看此要点:

import WebKit
struct WebView: ViewRepresentableHelper {
    var configuration = { (view: WKWebView) in }
}
Run Code Online (Sandbox Code Playgroud)

用法

var body: some View {
    WebView {
        $0.load(request)
    }
}
Run Code Online (Sandbox Code Playgroud)