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

使用@Binding在视图间传值引发无限循环问题求助

SwiftUI视图间传递State Object导致应用冻结问题

问题概述

在视图间传递State Object时出现嵌套视图问题,进入层级最深的视图后应用冻结,内存持续增长。

使用场景

合作伙伴列表 → 合作伙伴详情 → 位置列表 → 位置详情

原代码实现

视图模型

class PartnerViewModel: ObservableObject {
    @Published var partners: [Partner] = Partner.partners
}

该视图被加载到父类的TabView和NavigationStack组件中。

合作伙伴列表视图

struct PartnerListView: View {
    @StateObject var viewModel = PartnerViewModel()

    var body: some View {
        List($viewModel.partners, id: \.self) { $partner in
            NavigationLink {
                PartnerDetailView(partner: $partner)
            } label: {
                Text(partner.name)
            }
        }
    }
}

合作伙伴详情视图

struct PartnerDetailView: View {
    @Binding var partner: Partner

    var body: some View {
        Form {
            Section("Locations") {
                List($partner.locations, id: \.self) { $location in
                    NavigationLink {
                        LocationDetailView(location: $location)
                    } label: {
                        Text(location.name)
                    }
                }
            }

        }
    }
}

位置详情视图

struct LocationDetailView: View {
    @Binding var location: Location
    var body: some View {
        TextField("Name", text: $location.name)
    }
}

临时可行解决方案

修改后的合作伙伴详情视图

struct PartnerDetailView: View {
    @Binding var partner: Partner

    var body: some View {
        Form {
            Section("Locations") {
                List($partner.locations, id: \.self) { $location in
                    NavigationLink {
                        LocationDetailView(partner: $partner, locationIndex: partner.locations.firstIndex(of: location) ?? 0)
                    } label: {
                        Text(location.name)
                    }
                }
            }

        }
    }
}

修改后的位置详情视图

struct LocationDetailView: View {
    @Binding var partner: Partner
    var locationIndex: Int
    
    var body: some View {
        TextField("Name", text: $partner.locations[locationIndex].name)
    }
}

疑问

是不是我在视图间传值的方式有误?🤔

应用冻结时的内存增长情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:20:34