Meg*_*tor 7 xcode ios swift 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()
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,第一次点击一个单元格时,模态是空的,就好像在呈现模态内容之前状态没有更新,但之后的任何时候都按预期工作。我是否遗漏了一些明显的东西,还是应该提交雷达?
我发现的一种可能的解决方案是将工作表和状态移动为它们自己的结构:
struct ContentView: View {
@ObservedObject var items: ItemSet
init() {
self.items = ItemSet()
}
var columns = [
GridItem(.adaptive(minimum: 150), spacing: 5.0)
]
var body: some View {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(items.collection, id: \.id) {item in
TextItem(item: item)
}
}
}
}
}
struct TextItem: View {
let item: Item
@State private var showingFull = false
var body: some View {
Text(item.number)
.frame(height: 100)
.onTapGesture {
self.showingFull = true
}
.sheet(isPresented: $showingFull) {
Text(item.number)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道这个解决方案在正确的 SwiftUI 方面有多“正确”,但在更复杂和更重的布局中使用时我没有注意到任何性能问题。
这是多表冲突,因为您将同一张表附加到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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
839 次 |
最近记录: |