【问题标题】:SwiftUI: Force List Row to adjust height to contentSwiftUI:强制列表行调整高度到内容
【发布时间】:2022-01-24 07:36:05
【问题描述】:

我在使用不会改变行高的列表时遇到了一些问题。我把它分成一个简单的例子。

这是完整的演示代码:

struct ContentView: View {
  let items = ["item 1", "item 2", "item 3"]
  @State var error: [String: String] = []
  
  var body: some View {
    List {
      ForEach(self.items, id: \.self) { item in
        VStack {
          Text(item)
            .padding()
          if let e = error[item] {
            Text(e)
          }
        }
        .swipeActions(edge: .leading, allowsFullSwipe: true) {
          Button(action: {
            self.error[item] = "ERROR!"
          }) {
            Image(systemName: "square.and.arrow.up")
          }.background(Color.blue)
        }
      }
    }
  }
}

一旦用户滑动单元格,我想在常规项目下方显示一条错误消息。不幸的是,现在发生的事情是这样的:

我希望它看起来像这样(为此,我在代码中的“错误”字典中添加了一个元素):

在我看来,这是很多人都会面临的问题,但我无法找到有关此问题的太多信息。我尝试了一些东西(例如 '.fixedSize' 修饰符),但我尝试过的都没有奏效,如果有任何帮助或想法,我将不胜感激!

【问题讨论】:

    标签: ios swift iphone swiftui


    【解决方案1】:

    列出缓存创建的行,因此我们需要让它知道应该从头开始重建特定的行。可能的解决方案是使用.id,这取决于与可选错误文本相同的条件。

    使用 Xcode 13.2 / iOS 15.2 测试

    这里是修改的部分代码(为演示添加了一些额外的):

    .swipeActions(edge: .leading, allowsFullSwipe: true) {
      Button(action: {
        if nil == self.error[item] {
            self.error[item] = "ERROR!"
            } else {
                self.error[item] = nil
            }
      }) {
        Image(systemName: "square.and.arrow.up")
      }.background(Color.blue)
    }
    .id(item + (self.error[item] ?? ""))   // << here !!
    

    【讨论】:

    • 不理想,因为它替换了整个单元格,但它完成了工作。谢谢!
    猜你喜欢
    • 2021-10-01
    • 2020-10-18
    • 1970-01-01
    • 2014-11-06
    • 2015-11-03
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多