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

Swift中调用MealView.refresh()无法更新列表数据的问题求助

问题根源

你调用MealView().refresh()时,是新建了一个完全独立的MealView实例,和当前屏幕上显示的实例没有任何关联。新实例的meals数据更新了,但界面上的旧实例完全不受影响,所以列表不会刷新。

解决方案

方案一:用ViewModel共享状态(推荐)

把数据和刷新逻辑抽成独立的ViewModel类,通过共享实例实现跨视图状态同步:

  1. 创建ViewModel类
class MealViewModel: ObservableObject {
    @Published var meals: [String] = []
    
    func refresh() {
        sendGetRequest()
    }
    
    private func sendGetRequest() {
        meals = ["급식을 가져오고 있어요."]
        // 这里保留你的网络请求逻辑,请求完成后更新self.meals
    }
}
  1. 修改MealView,用ViewModel管理数据
struct MealView: View {
    @ObservedObject var viewModel: MealViewModel
    
    var body: some View {
        NavigationView {
            VStack{
                List(viewModel.meals, id: \.self) { meal in
                    Text(meal)
                }
                .refreshable {
                    viewModel.refresh()
                }
            }
        }
    }
}
  1. 在App结构中共享ViewModel实例
@main
struct mealtimeApp: App {
    @State private var selection = 1
    @AppStorage("_isFirstLaunching") var isFirstLaunch: Bool = true
    @State private var settingsPresented = false
    @StateObject private var mealViewModel = MealViewModel()
    
    var body: some Scene {
        WindowGroup {
            MealView(viewModel: mealViewModel)
            .sheet(isPresented: $isFirstLaunch) {
                // 启动引导sheet内容
            }
            .sheet(isPresented: $settingsPresented) {
                // 设置sheet内容
            }
            .onDisappear {
                mealViewModel.refresh()
                print("dd")
            }
        }
    }
}

方案二:用Binding传递刷新信号

如果不想用ViewModel,可以通过绑定变量触发刷新:

  1. 在App结构中添加刷新触发变量
@State private var shouldRefreshMeals = false
  1. 传递给MealView并监听变化
struct MealView: View {
    @State var meals: [String] = []
    @Binding var shouldRefresh: Bool
    
    var body: some View {
        NavigationView {
            VStack{
                List(meals, id: \.self) { meal in
                    Text(meal)
                }
                .refreshable {
                    sendGetRequest()
                }
            }
        }
        .onChange(of: shouldRefresh) { newValue in
            if newValue {
                sendGetRequest()
                shouldRefresh = false
            }
        }
    }
    
    // 保留原有的refresh和sendGetRequest方法
}
  1. 在sheet关闭时触发信号
.onDisappear {
    shouldRefreshMeals = true
    print("dd")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:32:25