iOS 17 NavigationStack中EditButton首次点击失效,求解决方案
问题现象
当List未被NavigationStack包裹时,EditButton的选择功能可正常触发:
struct ListSelectionTest: View { @State var selection: Set<String> = [] let strings = ["One", "Two", "Three"] var body: some View { VStack { EditButton() List(selection: $selection) { ForEach(strings, id: \.self) { string in Text(string).tag(string) } } } .padding() } } #Preview { ListSelectionTest() }
但将List放入NavigationStack后,在iOS 17中出现异常:EditButton首次点击无响应,仅当预先选中列表行时才会首次生效。该问题在iOS 16.4中不存在,移除NavigationStack后也可正常工作。已向Apple提交反馈(FB13201571)。
临时解决方案
方案1:将EditButton移至NavigationStack的Toolbar中
将系统EditButton放置在NavigationStack的toolbar内,可恢复正常触发逻辑:
struct ListSelectionTest: View { @State var selection: Set<String> = [] let strings = ["One", "Two", "Three"] var body: some View { NavigationStack { VStack { List(selection: $selection) { ForEach(strings, id: \.self) { string in Text(string).tag(string) } } } .padding() .toolbar { EditButton() } } } } #Preview { ListSelectionTest() }
方案2:手动管理编辑状态
如果需要保留EditButton在VStack中的布局,可手动实现编辑状态的控制,替代系统默认的EditButton:
struct ListSelectionTest: View { @State var selection: Set<String> = [] @State private var isEditing = false let strings = ["One", "Two", "Three"] var body: some View { NavigationStack { VStack { // 自定义编辑按钮,模拟系统EditButton的行为 Button(isEditing ? "Done" : "Edit") { withAnimation { isEditing.toggle() } } List(selection: $selection) { ForEach(strings, id: \.self) { string in Text(string).tag(string) } } // 通过环境变量控制List的编辑模式 .environment(\.editMode, .constant(isEditing ? .active : .inactive)) // 退出编辑时清空选中项,和系统默认行为保持一致 .onChange(of: isEditing) { newValue in if !newValue { selection.removeAll() } } } .padding() } } } #Preview { ListSelectionTest() }
以上两种方案均可解决iOS 17中NavigationStack内EditButton首次点击无响应的问题。
内容的提问来源于stack exchange,提问作者Easterdown
相关产品推荐
相关产品推荐

