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

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)
        }
        // ... 你的其他视图代码 ...
    }
}

为什么这样能解决问题?

  1. 原来的代码里WebView只是被创建了,但没被加到视图树中,现在我们通过Sheet或NavigationDestination把它整合到了SwiftUI的视图层级里,所以会正常显示。
  2. 警告也会消失,因为WebView的初始化结果现在被实际使用了。

内容的提问来源于stack exchange,提问作者grace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:08:11