Keyboard 在SwiftUI中使用WebKit在视图更新时隐藏键盘

Keyboard 在SwiftUI中使用WebKit在视图更新时隐藏键盘,keyboard,webkit,swiftui,wkwebview,uikeyboard,Keyboard,Webkit,Swiftui,Wkwebview,Uikeyboard,我已经为我所面临的这个问题创建了一个最小的可复制的例子 首先,我创建了一个WKWebView,它位于UIViewRepresentable中,用于SwiftUI。然后,我设置了WKUserContentController和WKWebViewConfiguration,以便WKWebView可以向本机代码发送消息。在本例中,我有一个在输入时发送其值 通过WebKit发送的值被分配给一个导致视图更新的@State变量。不幸的是,每当视图更新时,WKWebView就会被取消选择。我怎样才能解决这个问

我已经为我所面临的这个问题创建了一个最小的可复制的例子

首先,我创建了一个
WKWebView
,它位于
UIViewRepresentable
中,用于SwiftUI。然后,我设置了
WKUserContentController
WKWebViewConfiguration
,以便
WKWebView
可以向本机代码发送消息。在本例中,我有一个
在输入时发送其

通过WebKit发送的值被分配给一个导致视图更新的
@State
变量。不幸的是,每当视图更新时,
WKWebView
就会被取消选择。我怎样才能解决这个问题?
WKWebView
需要保持选中状态,直到用户有意选择隐藏键盘

这是一个最简单的例子:

导入快捷界面
导入WebKit
结构WebView:UIViewRepresentable{
让html:String
let配置:WKWebViewConfiguration
func makeUIView(上下文:context)->WKWebView{
.init(帧:.0,配置:配置)
}
func updateUIView(webView:WKWebView,context:context){
loadHTMLString(html,baseURL:nil)
}
}
结构ContentView:View{
最终类协调器:NSObject,WKScriptMessageHandler{
@绑定变量文本:字符串
init(文本:绑定){
_文本=文本
}
func用户内容控制器(
_userContentController:WKUserContentController,
didReceive消息:WKScriptMessage
) {
guard let text=message.body as?String else{return}
self.text=文本
}
}
@State var text=“”
var body:一些观点{
网络视图(
html:“”
\(文本)
const textarea=document.querySelector('textarea')
textarea.oninput=()=>
webkit.messageHandlers.main.postMessage(textarea.value)
""",
配置:{
让userContentController=WKUserContentController()
添加(协调器(文本:$text),名称:“main”)
let configuration=WKWebViewConfiguration()
configuration.userContentController=userContentController
返回配置
}()
)
}
}
我建议将事件处理更改为

textarea.onblur = () =>
    webkit.messageHandlers.main.postMessage(textarea.value)

否则,需要进行复杂的重构,以避免WK*实体与SwiftUI可表示包装器分离,或更改模型以避免使用
@State
或任何导致视图重建的内容,或两者兼而有之。

感谢您的回答。虽然这并不能解决我的问题,但我最终还是通过删除@State和observable对象来解决我的问题,确保keypress上没有视图重建。幸运的是,我能够找到一个解决办法,但我可以假设其他开发人员不幸无法找到。