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

iOS 17 NavigationStack中EditButton首次点击失效,求解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:48