在SwiftUI中控制嵌套UIView的惯用方式是什么

编程入门 行业动态 更新时间:2024-10-26 17:32:32
本文介绍了在SwiftUI中控制嵌套UIView的惯用方式是什么的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

I want to show a WKWebView in a SwiftUI view hierarchy, and I want to control the WKWebView using buttons implemented in SwiftUI.

我可以通过创建一个实现UIViewRepresentable并包装WKWebView的SwiftUI WebView类来做到这一点,就像这样...

I can do this by creating a SwiftUI WebView class that implements UIViewRepresentable and wraps WKWebView, like so...

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 } }

...然后按如下所述使用它...

...and then using it as follows...

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 } }

当用户点击按钮时,我想以某种方式调用WKWebView上的goBack.我该如何在SwiftUI中惯用的方式?

When the user taps the Button, I want to somehow call goBack on the WKWebView. How am I to do this idiomatically in SwiftUI?

我认为这种方法要么很脆弱,要么不是惯用的SwiftUI ...

Approaches I've considered that I think are either brittle or aren't idiomatic SwiftUI...

  • 表示用户在绑定中单击返回"的次数.让WebView监听该绑定,并在绑定增加时移回.

  • Represent the number of times that a user has clicked "Back" in a binding. Have WebView listen to that binding and move back when that increments.

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

Have BrowserView create an object called something like MutableWebViewAPI and pass it to WebView on construction. WebView listens on this object so that when BrowserView calls something like MutableWebViewAPI.goBack(), WebView does the same.

推荐答案

我认为最好的方法是通过在父视图上创建PassthroughSubject然后订阅孩子WebView中的事件来利用Combine的功能.

I think the best way is to leverage the power of Combine by creating a PassthroughSubject on your parent view and then subscribe to events in your child WebView.

首先,在UIViewReprsentable中创建一个结构,以捕获要发送到WebView的可用事件:

First, create a struct in your UIViewReprsentable that captures the available events you want to send to your WebView:

struct WebView: UIViewRepresentable { enum WebEvent { case back case forward } let eventPublisher: AnyPublisher<WebEvent, Never> init(eventPublisher: AnyPublisher<WebEvent, Never>) { self.eventPublisher = eventPublisher eventPublisher.sink { event in // forward the appropriate event to your underlying WKWebView } } }

接下来,在您的父母中,创建PassthroughSubject来创建这些事件.

Next, in your parent, create the PassthroughSubject to create these events.

struct ParentView: View { private let eventSender = PassthroughSubject<WebView.WebEvent, Never>() var body: some View { VStack { Button("Back") { self.eventSender.send(.back) } Button("Forward") { self.eventSender.send(.forward) } WebView(eventPublisher: eventSender.eraseToAnyPublisher()) } } }

更多推荐

在SwiftUI中控制嵌套UIView的惯用方式是什么

本文发布于:2023-11-30 10:40:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1649686.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   方式   SwiftUI   UIView

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!