SwiftUI中被NavigationLink包裹的List子项无法读取父级editMode环境变量
解决方案
根因说明
NavigationLink会创建独立的环境上下文,默认不会继承父视图层级的editMode环境变量,因此包裹后的子视图无法读取到全局编辑状态。
可行实现方案
不需要自定义编辑状态变量,仅需在父视图中读取系统原生editMode环境值,手动注入给NavigationLink包裹的子内容即可,完全保留原生编辑切换的平滑动画。
修改后完整代码
import SwiftUI struct DummyListView: View { var items = ["item 1", "item 2", "item 3"] // 读取系统原生的editMode环境变量 @Environment(\.editMode) private var editMode var body: some View { NavigationView { List { Section(header: Text("Basic Rows")){ ForEach(items, id: \.self){ item in ItemRow(itemName: item) } .onDelete { index in // delete functionality } } Section(header: Text("Wrapped in Navigation link")){ ForEach(items, id: \.self){ item in NavigationLink(destination: Text("Hello")){ ItemRow(itemName: item) // 手动注入父层的editMode到子视图环境 .environment(\.editMode, editMode) } } .onDelete { index in // delete functionality } } } .listStyle(InsetGroupedListStyle()) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { EditButton() } } } } struct ItemRow: View { @Environment(\.editMode) var editMode let itemName: String var body: some View { HStack { Text(itemName) Spacer() Text(editMode?.wrappedValue == .active ? "Active" : "Inactive") } } } }
效果验证
修改后两类行都会同步响应编辑状态切换,原生编辑动画完全保留,无额外自定义逻辑侵入。
内容的提问来源于stack exchange,提问作者Nik Payne
相关产品推荐
相关产品推荐

