【问题标题】:Preview crashed after added LazyVGrid添加 LazyVGrid 后预览崩溃
【发布时间】:2021-05-29 18:00:48
【问题描述】:

我正在学习斯坦福 CS193p,一切都很顺利,直到用 HStack 切换 LazyVGrid。

我与一位教授检查了我的代码,它们是相同的。但是我的代码中令人困惑的部分是,当我的 emojiCount = 4,预览效果很好时,我可以使用 LazyVGrid,但是当我将 emojiCount 值更改为超过 4 时,例如 5 或 24,它会立即崩溃。

崩溃信息是这样的:

Diagnostics

这是我的代码:

import SwiftUI

struct ContentView: View {
    var emojis = ["????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????", "????"]
   @State var emojiCount = 4
    
    var body: some View {
        VStack {
            LazyVGrid(columns:[GridItem(),GridItem(),GridItem()]) {
                ForEach(emojis[0..<emojiCount], id: \.self) { emoji in
                    CardView(content: emoji)
                }
            }
            .foregroundColor(.red)
            Spacer()
            HStack {
                remove
                Spacer()
                add
            }
            .font(.largeTitle)
            .padding(.horizontal)
        }
        .padding(.horizontal)
    }
    
    var remove: some View {
        Button {
            if emojiCount > 2 {
                emojiCount -= 1
            }
        } label: {
            Image(systemName:"minus.circle")
            }
    }
    
    var add: some View {
        Button {
            if emojiCount < emojis.count {
                emojiCount += 1
            }
        } label: {
            Image(systemName:"plus.circle")
            }
    }
}


struct CardView: View {
    var content: String
    @State var isFaceUp: Bool = true
    
    var body: some View {
        ZStack {
            let shape = RoundedRectangle(cornerRadius: 20)
            if isFaceUp {
                shape.fill().foregroundColor(.white)
                shape.stroke(lineWidth: 3)
                Text(content).font(.largeTitle)
            } else {
                shape.fill()
            }
        }
        .onTapGesture {
            isFaceUp = !isFaceUp
        }
    }
}


我试图弄清楚整个晚上,但我仍然不知道我的代码有什么问题。非常感谢!

【问题讨论】:

    标签: swiftui cs193p lazyvgrid


    【解决方案1】:

    在模拟器中运行代码,你会看到错误

    致命错误:每个布局项只能出现一次

    这导致了表情符号。你有很多,但只有 4 种不同的类型。 在\.self 引用项目的循环中,您有责任确保项目是唯一的。

    【讨论】:

    • 非常感谢!是的,您的回答完美解决了我的问题。但我确实有另一个问题。在我用 HStack 切换 LazyVGrid 之前,我的代码在 HStack 上运行良好,并且代码允许我添加超过 4 张卡,即使其中一些是相同的。你能解释一下这背后的逻辑吗?
    • ForEach 对于仅在普通 group 中显示项目的唯一性是非常宽容的,因为项目没有按字面意思标识。在网格视图中,项目被分配给网格项目,这要求项目是唯一的。
    猜你喜欢
    • 2021-01-14
    • 2020-04-18
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    相关资源
    最近更新 更多