首页 > 解决方案 > SwiftUI:打开带有动态内容的模式表仅在第一次尝试时失败

问题描述

目标是将动态内容传递到单个模式中,就好像它是一个详细视图:

import SwiftUI

struct Item {
  let number: String
  let id = UUID()
}

class ItemSet: ObservableObject {
  @Published var collection: [Item]
  
  init() {
    self.collection = []
    for index in 1...100 {
      self.collection.append(Item(number: "\(index)"))
    }
  }
}

struct ContentView: View {
  @ObservedObject var items: ItemSet
  @State private var selectedItem: Item?
  @State private var showingFull = false
  
  init() {
    self.items = ItemSet()
    self.selectedItem = nil
  }
    
  var columns = [
    GridItem(.adaptive(minimum: 150), spacing: 5.0)
  ]
  
  var body: some View {
    ScrollView {
      LazyVGrid(columns: columns) {
        ForEach(items.collection, id: \.id) {item in
          Text(item.number)
            .frame(height: 100)
            .onTapGesture {
              self.selectedItem = item
              self.showingFull = true
            }
            .sheet(isPresented: $showingFull) {
              if let item = selectedItem {
                Text(item.number)
              }
            }
        }
      }
    }
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}

出于某种原因,第一次点击单元格时,模态框是空的,就好像在呈现模态框内容之前状态没有更新,但之后的任何时间都可以按预期工作。我错过了一些明显的东西还是应该提交雷达?

标签: iosswiftxcodeswiftui

解决方案


这是多表冲突,因为您将同一张表附加到每个单元格ForEach并绑定到单个状态,因此单击它们会立即激活。解决方案是将工作表移出ForEach

这是一个更正的部分。使用 Xcode 12 / iOS 14 测试

  var body: some View {
    ScrollView {
      LazyVGrid(columns: columns) {
        ForEach(items.collection, id: \.id) {item in
          Text(item.number)
            .frame(height: 100)
            .onTapGesture {
              self.selectedItem = item
              self.showingFull = true
            }
        }
      }
    }
    .sheet(isPresented: $showingFull) {      // << here !!
      if let item = selectedItem {
        Text(item.number)
      }
    }
  }

推荐阅读