ios - 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()
}
}
出于某种原因,第一次点击单元格时,模态框是空的,就好像在呈现模态框内容之前状态没有更新,但之后的任何时间都可以按预期工作。我错过了一些明显的东西还是应该提交雷达?
解决方案
这是多表冲突,因为您将同一张表附加到每个单元格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)
}
}
}
推荐阅读
- antlr - 如何在单个规则中指定多个词法分析器规则?
- rust - 如何让结构将自身传递给另一个结构的函数
- python-3.x - 有没有办法使用 cloud-ndb 将用户与项目正确匹配
- javascript - 如何在字符串中找到最长的单词并返回那些(不包括重复项)以及最大长度?
- c# - 如何在 Windows 窗体上实时绘制图表?
- c# - openapi-generator 如何在我的解决方案的 MS 测试项目中生成 c-sharp .NET core 3.1 兼容测试?
- r - 将 R 中 DT 表中的值向左移动
- python - 如何识别熊猫索引和标题中的日期?
- python - ValueError: 时间数据 1.2.20 与格式 %m/%d/%y 不匹配
- django - Django 创建视图表单验证警告