You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中使用WebView?现有代码报错求助

问题解决:Generic struct 'VStack' requires that 'WebView' conform to 'View'

错误根源

你用@State存储WebView实例,但@State包装后的变量类型是State<WebView>,而非WebView本身。State<T>并不遵循View协议,导致VStack无法识别它为可渲染的视图。实际上UIViewRepresentable类型本身已经遵循View协议,完全不需要用@State来存储实例。

修复后的代码

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        VStack {
            WebView(request: URLRequest(url: URL(string: "https://github.com")!))
        }
    }
}

struct WebView: UIViewRepresentable {
    let request: URLRequest
    
    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(request)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

进阶优化建议

如果需要后续控制WebView的行为(比如切换链接、刷新),可以通过绑定状态值传递操作,而非存储WebView实例:

  • 给WebView添加绑定属性触发操作
  • 在ContentView中管理对应状态

示例代码:

import SwiftUI
import WebKit

struct ContentView: View {
    @State private var targetURL = URL(string: "https://github.com")!
    
    var body: some View {
        VStack {
            Button("切换到Swift官网") {
                targetURL = URL(string: "https://swift.org")!
            }
            WebView(request: URLRequest(url: targetURL))
        }
    }
}

struct WebView: UIViewRepresentable {
    let request: URLRequest
    
    func makeUIView(context: Context) -> WKWebView {
        WKWebView()
    }
    
    func updateUIView(_ uiView: WKWebView, context: Context) {
        // 避免重复加载相同请求
        if uiView.url != request.url {
            uiView.load(request)
        }
    }
}

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:35:26