【问题标题】:WKWebViews in SwiftUI layout get updated - become blankSwiftUI 布局中的 WKWebViews 得到更新 - 变为空白
【发布时间】:2021-09-13 14:23:01
【问题描述】:

我的 iOS SwiftUI 应用在布局中有一些 WKWebViews。

可以通过创建一个包含 WKWebView 的特殊视图来实现,因为它是从其他 SO 问题中得知的。

包括合适的方法:

func webView(_ webView: WKWebView,
    didFinish navigation: WKNavigation!)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
func makeUIView(context: Context) -> WKWebView
func updateUIView(_ uiView: WKWebView, context: Context)

主屏幕有两个 WKWebView,一个在左侧,另一个在右侧,在两个包含 WebView 的不同视图中(这就是我命名 WKWebView 封闭视图的方式)。

所以在一个 HStack 中有两个视图,它们分屏。

每个视图都有自己的布局,但内部也有一个 WebView。

左侧 WebView 正确显示应用创建的 HTML 页面。

右侧的 WebView 内部有一个可编辑的文本区域。

以下是在iOS模拟器上测试的,不知道在真机上是否一样,但很有可能。

当我编辑一些文本时,我认为重新计算布局并且我体验到两个WebViews变成空白,

然后调用 updateUIView 方法。

body中的WebView是用一个在body外部赋值的变量引用的,所以

好像

左视图

var body: some View
{

leftWebView

}

而不是

var body: some View
{

LeftWebView()

}

所以它不应该被重新创建。

确实我认为它没有被重新创建,但它变成了空白。

【问题讨论】:

  • 没有看到您的代码,就不可能说出它为什么不起作用。但我会建议你确保你的 UIViewRepresentable 设置正确,并有一个协调器作为 webview 委托。有关使用 MapKit 的类似解决方案,请参阅本文:hackingwithswift.com/books/ios-swiftui/…
  • @hayesk 代理设置正确,WebView 正确显示其内容。该应用程序还使用 Javascript 命令在 HTML 中执行操作并返回值。只是我需要在重新计算视图层次结构时不要从头开始重新绘制它。在 SwiftUI 中,它似乎可以发生在很小的变化上,比如通过键入单个字符来编辑可编辑区域。但是在那个周期它变成空白,这是错误的,因为内容丢失了。至少这是我所理解的,因为两个 WebView 都是空白的,而我只编辑其中一个。
  • 您是否在 UIViewRepresentable 中使用了协调器?
  • @hayesk 现在我也有了协调员,正如你所建议的,但没有任何改变。 WebViews 似乎被重新创建(在键入后重新计算布局的同时),makeUIView 被调用(这里 coordinator 设置为从上下文中的委托),并且还调用了 coordinator 和 init 的 coordinator。 WebViews 是空白的,因为它们是“重新创建”的,尽管不是来自它们的初始化程序。它们在正文中被引用,如 webView,而不是 WebView(),但它们在内容中从头开始(变为空)。
  • @hayesk 如果您有兴趣我找到了可能的解决方案,请参阅我的回答。

标签: html ios layout swiftui wkwebview


【解决方案1】:

我找到了可能的解决方案或解决方法。

不提供代码是因为不知道好不好,所以在这里总结一下。

它对我有用。

而不是将 WKWebView 嵌入到 SwiftUI 视图中

我在 SwiftUI 视图中嵌入了一个 ViewController。 只是在 SwiftUI View 端的实现有一些不同。

例子很容易找到。

这个 ViewController 托管一个从 xib 文件加载的视图,它是一个简单的视图,我在设计器工具中创建了它,没有要创建的出口或其他麻烦。

然后以编程方式将 WKWebView 添加到 UIView 中。

因此,碰巧的是,我的应用程序中的 WKWebViews 不会受到 SwiftUI 布局层次结构周期的干扰,并且可以正确显示。

当其中一个被编辑或布局更改时,它们不会变为空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2021-02-09
    • 2023-04-08
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多