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

SwiftUI中如何从另一个视图更新结构体数组的内容?

问题根因

你遇到的是SwiftUI视图状态同步的典型问题:@State 是视图私有状态,仅作用于当前视图本身,默认无法和子视图同步;且iOS 15+ 非全屏sheet弹出后,父视图的onAppear不会在sheet dismiss时重新触发,所以原有写在onAppear里的刷新逻辑不会执行。

可落地的三种解决方案

方案1:使用@Binding双向绑定数组

适合添加任务后能直接拿到新任务结构体对象,不需要重新拉取全量数据的场景

  1. 在AddTaskView中定义接收绑定数组的属性
@Binding var myresults: [MyResults]
@Environment(\.dismiss) var dismiss
  1. 调用新增API成功后,把新生成的MyResults对象插入到绑定数组中,再执行dismiss
// 新增API请求成功后
let newTask = MyResults(/* 接口返回的新任务参数 */)
myresults.append(newTask)
dismiss()
  1. 在IssueListView弹出AddTaskView时传入绑定值
.sheet(isPresented: $showAddTaskView) {
    AddTaskView(myresults: $myresults)
}

方案2:使用闭包回调触发刷新

适合新增任务后需要重新拉取全量接口数据的场景,耦合度更低

  1. 在AddTaskView中定义成功回调闭包
var addSuccessCallback: (() -> Void)?
@Environment(\.dismiss) var dismiss
  1. 新增API调用成功后执行回调,再dismiss
// 新增API请求成功后
addSuccessCallback?()
dismiss()
  1. 在IssueListView中接收回调,执行原有数据拉取逻辑
    首先把你写在onAppear里的请求逻辑抽成独立方法:
private func fetchTaskList() {
    // 原有调用API获取数据、赋值给myresults的逻辑
}

弹出视图时绑定回调:

.sheet(isPresented: $showAddTaskView) {
    AddTaskView()
        .addSuccessCallback {
            fetchTaskList()
        }
}

方案3:使用ObservableObject做全局状态管理

如果任务列表数据需要在多个页面共享,推荐用这种方案

  1. 定义统一的视图模型
class TaskViewModel: ObservableObject {
    @Published var myresults: [MyResults] = []
    
    func fetchTaskList() {
        // 原有API拉取逻辑,成功后赋值给myresults
    }
}
  1. 在IssueListView中持有视图模型
@StateObject private var vm = TaskViewModel()

onAppear中调用vm.fetchTaskList(),列表直接绑定vm.myresults渲染。
3. 在AddTaskView中接收视图模型,新增成功后调用拉取方法

@EnvironmentObject var vm: TaskViewModel
@Environment(\.dismiss) var dismiss

// 新增成功后
vm.fetchTaskList()
dismiss()

弹出时注入环境对象:

.sheet(isPresented: $showAddTaskView) {
    AddTaskView()
        .environmentObject(vm)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 07:15:02