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

SwiftUI中如何为Firebase列表按钮传递正确WebView链接?

问题分析

你的问题出在弹窗触发逻辑和数据捕获方式上:

  • 所有列表项共用同一个showWebViewArts布尔变量,点击任何按钮都会触发同一个弹窗。
  • SwiftUI的sheet(isPresented:)是延迟渲染内容的,当弹窗真正显示时,循环中的algorithm已经指向列表的最后一个元素,所以所有弹窗都会加载最后一篇文章的链接。
解决方案

改用sheet(item:)替代sheet(isPresented:),通过绑定选中的文章对象来传递正确的链接,具体步骤如下:

  1. 修改View的状态变量
    把原来的private var showWebViewArts = false替换为存储选中文章的可选变量:
@State private var selectedArticle: Algorithm?
  1. 调整列表按钮和弹窗逻辑
    更新List中的Button点击事件和sheet绑定:
List(viewModel.books) { algorithm in
    VStack(alignment: .leading) {
        HStack {
            Button(algorithm.title) {
                selectedArticle = algorithm // 点击时存储当前选中的文章
            }
            .listRowSeparator(.visible, edges: .all)
            .listRowSeparatorTint(Color.red)
            .font(.headline)
            .foregroundColor(.indigo)
        }
        // 使用item绑定选中的文章,只有当selectedArticle不为nil时才显示弹窗
        .sheet(item: $selectedArticle) { article in
            VStack(spacing: 0) {
                HeaderView()
                // 使用选中文章的链接,添加可选绑定避免无效URL崩溃
                if let url = URL(string: article.link) {
                    WebView(url: url)
                } else {
                    Text("无效链接")
                }
                .background(Color.accentColor)
            }
        }
    }
}
  1. 可选优化:确保ID唯一性
    确认Algorithm结构体的id是唯一值(比如Firestore文档ID或业务唯一标识),这样sheet(item:)可以正确区分不同的文章对象,避免弹窗识别混乱。
原理说明

sheet(item:)会根据绑定的可选对象是否存在来控制弹窗显示,并且每次弹窗渲染时都会使用当前选中的对象数据,彻底解决了isPresented方式下的延迟捕获问题,确保每个按钮点击都能传递对应文章的链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:13:18