Swift中如何消除“Result of 'WebView' initializer is unused”警告并实现OpenURLAction跳转至WebView
嘿,我来帮你搞定这个问题!
你遇到的核心问题是:OpenURLAction的handler并不是用来直接返回视图的——你在这里创建了WebView实例,但根本没把它添加到当前的SwiftUI视图层级里,所以既不会显示WebView,还会触发“初始化器结果未使用”的警告。
下面给你两种可行的解决方案,选适合你项目的就行:
方案1:用Sheet弹出WebView(兼容iOS13+)
这种方式最通用,通过状态变量控制Sheet的显示,把WebView放到Sheet里:
// 先在视图里添加两个状态变量 @State private var shouldShowWebView = false @State private var targetURL: URL? public var body: some View { // ... 你的其他视图代码 ... Group { if #available(iOS 15.0, *) { Text(.init(model.blockText())) .environment(\.openURL, OpenURLAction(handler: { url in // 这里只记录要打开的URL,触发Sheet显示 targetURL = url shouldShowWebView = true return .handled })) } else { Text(.init(model.blockText())) } } // 添加Sheet,用来展示WebView .sheet(isPresented: $shouldShowWebView) { if let url = targetURL { WebView(url: url) // 可以给Sheet加导航栏,方便关闭 .navigationTitle("网页") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button("关闭") { shouldShowWebView = false } } } } } // ... 你的其他视图代码 ... }
方案2:用NavigationStack跳转(iOS16+)
如果你的项目只需要支持iOS16及以上,可以用NavigationStack的导航目标来实现:
// 添加状态变量记录要打开的URL @State private var targetURL: URL? public var body: some View { NavigationStack { // ... 你的其他视图代码 ... Group { if #available(iOS 15.0, *) { Text(.init(model.blockText())) .environment(\.openURL, OpenURLAction(handler: { url in targetURL = url return .handled })) } else { Text(.init(model.blockText())) } } // 设置导航目标,当targetURL有值时跳转WebView .navigationDestination(item: $targetURL) { url in WebView(url: url) .navigationTitle("网页") .navigationBarTitleDisplayMode(.inline) } // ... 你的其他视图代码 ... } }
为什么这样能解决问题?
- 原来的代码里WebView只是被创建了,但没被加到视图树中,现在我们通过Sheet或NavigationDestination把它整合到了SwiftUI的视图层级里,所以会正常显示。
- 警告也会消失,因为WebView的初始化结果现在被实际使用了。
内容的提问来源于stack exchange,提问作者grace
相关产品推荐
相关产品推荐

