添加 LazyVGrid 后预览崩溃
Preview crashed after added LazyVGrid
我正在学习 Stanford 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
}
}
}
我想了一整夜,但我仍然不知道我的代码有什么问题。非常感谢!
运行模拟器中的代码,你会看到错误
Fatal error: each layout item may only occur once
这导致表情符号。你有很多,但只有 4 种不同的类型。
在项目被 \.self
引用的循环中,您有责任确保项目是唯一的。
我正在学习 Stanford 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
}
}
}
我想了一整夜,但我仍然不知道我的代码有什么问题。非常感谢!
运行模拟器中的代码,你会看到错误
Fatal error: each layout item may only occur once
这导致表情符号。你有很多,但只有 4 种不同的类型。
在项目被 \.self
引用的循环中,您有责任确保项目是唯一的。