SwiftUI中使用StackNavigationViewStyle时EditButton失效问题
原因说明
当NavigationView使用StackNavigationViewStyle样式时,旧版navigationBarItems修饰符中添加的EditButton,其关联的编辑模式环境变量无法正常同步到List层级,最终导致点击编辑按钮后List没有进入编辑状态的异常。
解决方案
提供两种适配方案,可根据你的项目支持的系统版本选择:
方案1:手动绑定编辑模式(兼容iOS 13及以上)
在视图中主动声明编辑模式状态,手动注入到List所在的视图层级即可:
// 视图内新增编辑模式状态声明 @State private var editMode: EditMode = .inactive var body: some View { NavigationView { List { ForEach(books, id: \.self) { book in // 你的列表项逻辑 } .onDelete(perform: deleteBooks) } // 手动注入编辑模式环境变量 .environment(\.editMode, $editMode) .navigationBarItems(leading: EditButton(), trailing: /* 你的其他按钮 */) // 其他原有修饰符 } .navigationViewStyle(StackNavigationViewStyle()) }
方案2:使用官方推荐的Toolbar API(iOS 15及以上)
苹果从iOS 15开始废弃了navigationBarItems,改用toolbar配置导航栏元素,该API会自动处理编辑模式的同步逻辑,不需要额外手动绑定:
var body: some View { NavigationView { List { ForEach(books, id: \.self) { book in // 你的列表项逻辑 } .onDelete(perform: deleteBooks) } // 替换navigationBarItems为toolbar配置 .toolbar { ToolbarItem(placement: .navigationBarLeading) { EditButton() } ToolbarItem(placement: .navigationBarTrailing) { // 你的其他导航栏按钮 } } // 其他原有修饰符 } .navigationViewStyle(StackNavigationViewStyle()) }
异常现象参考

内容的提问来源于stack exchange,提问作者Tao.T
相关产品推荐
相关产品推荐

