繁体   English   中英

swift 跳过第一个变量更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM