SwiftUI传ViewModel字符串到绑定类型子视图出现类型错误如何解决
问题原因
你当前的报错是因为WebView里定义了@Binding var text: String,要求传入的是双向绑定类型的值,但你直接传了普通的String类型的post.tweet,类型不匹配导致报错。
两种解决方案
方案1:不需要修改text的场景(最常用,适配绝大多数网页展示需求)
如果你的WebView只需要展示HTML内容,不需要修改上层传入的post.tweet的值,完全不需要使用@Binding,直接把WebView的属性改成普通常量即可:
struct WebView: UIViewRepresentable { // 移除@Binding声明,改为普通常量属性 let text: String func makeUIView(context: Context) -> WKWebView { return WKWebView() } func updateUIView(_ uiView: WKWebView, context: Context) { uiView.loadHTMLString(text, baseURL: nil) } }
改完后原来的调用代码WebView(text: post.tweet)不需要做任何修改,直接就能正常运行。
方案2:确实需要双向绑定text的场景
如果你有特殊需求,需要在WebView内部修改上层的post.tweet值,那就需要保持@Binding定义,同时给WebView传入绑定值:
首先你需要遍历可绑定的posts数组,调用时加上$前缀获取绑定:
ForEach($vm.posts!, id: \.id) { $post in // 此处获取post的绑定对象 VStack(alignment: .leading, spacing: 10) { WebView(text: $post.tweet) // 传入tweet属性的绑定 .frame(width: 700, height: 400).offset(x: 140) } }
额外优化建议
尽量不要直接强制解包vm.posts,可以加个空值判断避免数组为空时崩溃:
if let posts = vm.posts { ForEach(posts, id: \.id) { post in // 原有列表逻辑 } }
内容的提问来源于stack exchange,提问作者Daryl Wong
相关产品推荐
相关产品推荐

