Ios 什么';这是在SwiftUI中控制嵌套UIView的惯用方法

Ios 什么';这是在SwiftUI中控制嵌套UIView的惯用方法,ios,swift,wkwebview,swiftui,Ios,Swift,Wkwebview,Swiftui,我希望在SwiftUI视图层次结构中显示WKWebView,并希望使用SwiftUI中实现的按钮控制WKWebView 我可以通过创建一个SwiftUIWebView类来实现这一点,该类实现了UIViewRepresentable并包装了WKWebView,如下所示 struct WebView: UIViewRepresentable { func makeUIView(context: UIViewRepresentableContext<WebView>) -> W

我希望在SwiftUI视图层次结构中显示WKWebView,并希望使用SwiftUI中实现的按钮控制WKWebView

我可以通过创建一个SwiftUI
WebView
类来实现这一点,该类实现了
UIViewRepresentable
并包装了
WKWebView
,如下所示

struct WebView: UIViewRepresentable {

  func makeUIView(context: UIViewRepresentableContext<WebView>) -> WKWebView {
    return WKWebView(frame: .zero)
  }

  func updateUIView(_ uiView: WKWebView, context: UIViewRepresentableContext<WebView>) {
    // Update WKWebView here if necessary
  }
}
当用户点击按钮时,我想在
WKWebView
上调用
goBack
。我如何在SwiftUI中习惯性地执行此操作

我认为这些方法要么是脆弱的,要么不是惯用的快捷方式

  • 表示用户在绑定中单击“后退”的次数。让WebView侦听该绑定,并在该绑定增加时向后移动

  • BrowserView
    创建一个名为
    MutableWebViewAPI
    的对象,并在构建时将其传递给
    WebView
    WebView
    侦听此对象,这样当
    BrowserView
    调用类似
    MutableWebViewAPI.goBack()
    的内容时,
    WebView
    也会执行相同的操作


我认为最好的方法是利用Combine的强大功能,在父视图上创建一个
直通主题
,然后在子视图
WebView
中订阅事件

首先,在
ui视图reprsentable
中创建一个结构,该结构捕获要发送到
WebView
的可用事件:

struct-WebView:UIViewRepresentable{
枚举WebEvent{
箱背
案例转发
}
让eventPublisher:AnyPublisher
init(eventPublisher:AnyPublisher){
self.eventPublisher=eventPublisher
eventPublisher.sink{中的事件
//将适当的事件转发到您的基础WKWebView
}
}
}
接下来,在父级中,创建
PassthroughSubject
以创建这些事件

结构父视图:视图{ private let eventSender=PassthroughSubject() var body:一些观点{ VStack{ 按钮(“后退”){ self.eventSender.send(.back) } 按钮(“前进”){ self.eventSender.send(.forward) } WebView(eventPublisher:eventSender.橡皮擦到任何Publisher()) } } }

struct BrowserView: View {
  var body: some View {
    VStack {
      WebView()

      // Footer
      HStack {
        Button(action: {
          // When this is called, I want to somehow call .goBack()
          // on the WKWebView.
        }) {
          Image(systemName: "chevron.left")
        }

        ...
      } // HStack
    } // VStack
  }
}