SwiftUI:嵌入到HStack Section标头中时,EditButton不会触发onDelete

时间:2020-01-22 00:58:44

标签: ios swift swiftui

我有一个“表单”部分,我想在同一标题行中显示一些文本和EditButton(),如下所示:

enter image description here

只要将按钮嵌入到HStack中,当我点击按钮时,就会发生此问题。按钮文本在“编辑”和“完成”之间切换,但不会为行调用onDelete()操作。但是,如果仅将其分配为页眉,页脚或嵌入到该节的组安排中,则它确实可以工作。

Section(header: HStack { Text("Recent"); Spacer(); EditButton() }) {

    ForEach(locationsList, id:\.self) { location in

        Text("\(location.name)")

    }.onDelete(perform: deleteLocation)
}

有人将我的ForEach循环嵌入到诸如HStack,VStack甚至ZStack之类的视图排列中时为什么不响应按钮吗?有没有其他方法可以在不使用HStack的情况下实现标头的相同布局?

2 个答案:

答案 0 :(得分:1)

看起来像是因为EditButton在列表内。如将EditButtonList中移出,如下所示

enter image description here

VStack {
    HStack { Text("Recent"); Spacer(); EditButton() }
        .padding(.horizontal)
        .background(Color(UIColor.systemGray3))
    List{
            ForEach(locationsList, id:\.self) { location in
            ...

答案 1 :(得分:0)

EditButton 可能以环境值 editMode 的形式写入传递给它的绑定:

var editMode: Binding<EditMode>? { get set }

Form/List 可能管理它自己的 EditMode 状态,一个绑定通过环境传播到它的所有子 EditButton,除了出于某种原因,中介 Z/V/HStack 会干扰这种传播。而是使用您自己的状态:

@State var editMode: EditMode = .inactive

...

  Form {
    Section(header: HStack { 
      Text("Recent")
      Spacer()
      EditButton().environment(\.editMode, $editMode) 
    }) {
      ...
    }
  }
  .environment(\.editMode, $editMode)

Form 现在具有与 editMode 相同的 EditButton 环境,绕过了任何 HStack 怪癖。我猜 Form/List 只是尊重传递给他们的 editMode,只要它不是 nil 或类似的东西。

这样做的好处是您不必更改视图层次结构。