【发布时间】: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