[英]swift skips first variable update
我一直在网上学习 Standford CS193p 免费课程,我的作业 6 有一个奇怪的情况。我应该创建一个主题列表,用户可以从中直接开始使用所选主题的游戏。 此列表可以编辑,并且在 editMode 中时,点击手势用于打开一个工作表,从中编辑点击的主题。 为此,点击手势获取点击主题的索引并将其存储为 selectedThemeIndex。
我不明白为什么这在运行代码后第一次不起作用,这意味着点击任何列表项第一次总是打开索引 0,而不管点击具有另一个索引的项目。 然后,当关闭编辑表并点击任何其他列表项时,会打开正确的主题进行编辑。 这对我来说意味着 Swift 正在将第一次更新从 0 跳过到 selectedThemeIndex 上的另一个索引。 为什么会发生这种情况,我该如何纠正?
完整的应用程序代码可以从分支Assignment6中提取: https://github.com/kranca/Memorize.git
import SwiftUI
struct ThemeChooser: View {
@EnvironmentObject var store: ThemeStore
@State private var editMode: EditMode = .inactive
@State private var editing = false
var body: some View {
NavigationView {
List {
ForEach(store.themes) { theme in
let game = store.themes[theme].emojis.count > 1 ? EmojiMemoryGame(theme: theme) : nil
NavigationLink(destination: store.themes[theme].emojis.count > 1 ? EmojiMemoryGameView(game: game!) : nil, label: {
VStack(alignment: .leading) {
HStack {
VStack(alignment: .leading) {
Text(theme.name)
Text("Pairs: \(theme.cardPairs)")
}
RoundedRectangle(cornerRadius: 5)
.size(width: 30, height: 45)
.fill()
.foregroundColor(Color(rgbaColor: theme.rgbaColor))
}
Text(theme.emojis)
}
// call on gesture active only when in editMode
.gesture(editMode == .active ? tap(on: store.themes.firstIndex(of: theme) ?? 0) : nil)
})
}
.onDelete(perform: { indexSet in
store.themes.remove(atOffsets: indexSet)
})
.onMove(perform: { indexSet, newOffset in
store.themes.move(fromOffsets: indexSet, toOffset: newOffset)
})
}
.navigationTitle("Choose a theme!")
.toolbar {
ToolbarItem(placement: .navigationBarLeading) { editMode == .active ? newThemeButton : nil }
ToolbarItem { EditButton() }
}
.sheet(isPresented: $editing) {
ThemeEditor(theme: $store.themes[chosenThemeIndex])
}
.environment(\.editMode, $editMode)
}
}
// variable I want to update
@State private var chosenThemeIndex: Int = 0
// gesture which takes tapped index and updates chosenThemeIndex
func tap(on tapedThemeIndex: Int) -> some Gesture {
TapGesture().onEnded {
chosenThemeIndex = tapedThemeIndex
editing = true
}
}
private var newThemeButton: some View {
Button("Add New Theme") {
chosenThemeIndex = 0
store.insertTheme(named: "", cardPairs: 2)
editing = true
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.