【问题标题】:SwiftUI: EditButton does not trigger onDelete when embedded within an HStack Section headerSwiftUI:EditButton 在嵌入 HStack Section 标头时不会触发 onDelete
【发布时间】:2020-05-08 02:45:10
【问题描述】:

我有一个表单部分,我想在同一标题行中显示一些文本和 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 等视图排列中时,是否有人有任何理由说明为什么我的 ForEach 循环不会响应按钮?是否有替代方法可以在不使用 HStack 的情况下为标题实现相同的布局?

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    看起来是因为EditButton 在列表中。如果将EditButton 移出List 则有效,如下所示

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

    【讨论】:

    • 好建议,谢谢!我想在这种特殊情况下,使用 Lists 做 VStack 比 Form/Section 更好。
    【解决方案2】:

    EditButton 大概会写入以环境值editMode 的形式传递给它的绑定:

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

    Form/List 可能管理自己的EditMode 状态,通过环境将绑定传播到其所有子EditButtons,除非由于某种原因中间Z/V/HStack 干扰通过这种传播。而是使用您自己的状态:

    @State var editMode: EditMode = .inactive
    
    ...
    
      Form {
        Section(header: HStack { 
          Text("Recent")
          Spacer()
          EditButton().environment(\.editMode, $editMode) 
        }) {
          ...
        }
      }
      .environment(\.editMode, $editMode)
    
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多