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

SwiftUI 向子视图传递数组时子视图始终获取初始值问题

问题原因

问题出在RemindersListView对reminders属性的修饰符使用错误:

  • @State是SwiftUI中用于标记视图私有本地状态的属性包装器,它只会在视图首次初始化时接收传入的初始值,后续父视图重新传入新的参数值时,不会更新@State修饰的属性。
    这就是父视图ContentView的reminders已经更新,但子视图拿到的还是初始空数组的根本原因。
解决方案

将子视图的reminders属性从@State改为@Binding,同时父视图传参时传入绑定值即可:

  1. 修改RemindersListView的属性声明:
struct RemindersListView: View {
    // 把@State改成@Binding
    @Binding var reminders: [Reminder]
    
    var body: some View {
        print("RemindersListView", reminders)
        return List {
            ForEach($reminders) { $reminder in
                ReminderView(reminder: $reminder)
            }
        }
    }
}

额外优化:这里直接对reminders数组做绑定遍历,不需要用索引,避免数组变化时的索引越界风险

  1. 修改ContentView中调用子视图的传参方式,传入绑定值:
RemindersListView(
    reminders: $reminders
)

修改完成后父子视图的reminders数组会完全同步,父视图修改后子视图也会同步更新对应值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:39:00