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

SwiftUI删除列表最后一项后如何手动关闭编辑模式

解决方案

问题成因

SwiftUI的EditButton会绑定当前视图层级下共享的editMode环境值,仅对存在可编辑列表的场景自动做状态联动。当你删除最后一个清单条目、视图从列表页切换为空占位页时,原列表关联的激活编辑状态没有被系统自动回收,就会卡在“完成”的按钮展示态;后续新增条目重新渲染列表时,残留的编辑状态就会被带回来,造成交互异常。

手动关闭编辑模式的实现方式

核心逻辑是在列表变为空的时机,主动将共享的编辑环境值重置为非激活状态,不需要完全自定义替换EditButton,改动量极小:

  1. 在视图中引入系统共享的editMode环境绑定
  2. 监听列表空状态的变化,触发编辑模式重置
  3. (可选优化)空列表时隐藏无意义的编辑按钮

改造后的完整代码

import SwiftUI

struct HomeView: View {
    // 引入视图层级共享的编辑模式绑定,和EditButton读写的是同一个值
    @Environment(\.editMode) private var editMode
    @EnvironmentObject var checklistsVM: Store
    @StateObject var homeVM: HomeViewModel = HomeViewModel()
    
    var body: some View {
        NavigationView {
            Group {
                if(checklistsVM.checklists.isEmpty) {
                    EmptyList()
                        .environmentObject(homeVM)                    
                } else {
                    HomeListResults()
                        .environmentObject(homeVM)
                }
            }
            .navigationBarTitle("Checklists", displayMode: .large)
            // 监听列表空状态变化,主动重置编辑模式
            .onChange(of: checklistsVM.checklists.isEmpty) { isEmptyList in
                if isEmptyList {
                    // 列表为空时,强制切回非编辑状态,EditButton会自动切回「编辑」文案
                    editMode?.wrappedValue = .inactive
                }
            }
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    // 空列表时不展示编辑按钮,避免无意义的交互入口
                    if !checklistsVM.checklists.isEmpty {
                        EditButton()
                    }
                }
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

注意事项

  • 如果你需要兼容iOS 13/14系统,使用对应版本的onChange单闭包语法即可;也可以在列表删除操作的回调里,直接判断删除后列表长度是否为0,同步执行编辑模式重置的逻辑,效果完全一致。
  • 不需要自定义按钮替换原生EditButton:只要editMode的值被正确修改,原生按钮的文案、交互逻辑都会自动同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 20:24:04