我有一个“表单”部分,我想在同一标题行中显示一些文本和EditButton()
,如下所示:
只要将按钮嵌入到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的情况下实现标头的相同布局?
答案 0 :(得分:1)
看起来像是因为EditButton
在列表内。如将EditButton
从List
中移出,如下所示
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
或类似的东西。
这样做的好处是您不必更改视图层次结构。