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

SwiftUI中依次修改State变量失效?点击Menu按钮加载网页异常

问题解决:SwiftUI Menu点击后WebView加载URL为空的问题

你的问题出在fullScreenCover(isPresented:)的状态更新时机上:当你先给urlToLoad赋值再切换showWebPage时,SwiftUI的视图刷新节奏可能没跟上,导致WebView初始化时拿到的还是旧的空字符串,甚至会因为强制解包URL(string: urlToLoad)!崩溃。

换用fullScreenCover(item:)的方式可以彻底解决这个问题,它通过绑定一个可选值来控制弹窗展示,只有当可选值非空时才会触发,而且能直接把URL传递给WebView,避免状态不同步的问题。

修改后的完整代码:

@State private var selectedURL: URL?

// ...

View()
    .toolbar {
        ToolbarItem(placement: .navigationBarTrailing) {
            Menu {
                Button("FAQ") {
                    selectedURL = URL(string: "https://example.com/faqsLink")
                }
                Button("Privacy Policy") {
                    selectedURL = URL(string: "https://example.com/privacyLink")
                }
                Button("Terms and Conditions") {
                    selectedURL = URL(string: "https://example.com/termsLink")
                }
            } label: {
                // 补充Menu的触发标识,比如图标或文字
                Image(systemName: "ellipsis.circle")
            }
        }
    }
    .fullScreenCover(item: $selectedURL) { url in
        WebView(url: url)
    }

关键说明:

  • 用@State private var selectedURL: URL?替代原来的两个状态变量,把要加载的URL和弹窗触发逻辑合并,逻辑更简洁
  • fullScreenCover(item:)会在selectedURL从nil变为非空URL时自动展示弹窗,同时把当前的URL直接传递给闭包里的WebView,完全避免状态不同步
  • 移除了原来的presentWebView函数,直接在按钮动作里赋值URL,代码更直观
  • 避免了强制解包URL(string:)的风险(如果URL格式错误,selectedURL会保持nil,弹窗不会触发)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:01:15