使用ForEach重新排序动画的SwiftUI无法使用索引

使用ForEach重新排序动画的SwiftUI无法使用索引,swift,swiftui,Swift,Swiftui,我正在尝试使它,以便当项目列表被洗牌时,Vstack中的视图可以重新排序动画 我用下面的代码实现了它 VStack { ForEach(viewModel.game.cards) { card in CardView(card: card) } Button("Randomize") { withAnimation(.easeInOut) { self.viewModel.ne

我正在尝试使它,以便当项目列表被洗牌时,Vstack中的视图可以重新排序动画

我用下面的代码实现了它

VStack {
    ForEach(viewModel.game.cards) { card in
        CardView(card: card)
    }
         
    Button("Randomize") {
        withAnimation(.easeInOut) {
            self.viewModel.newGame()
        }
    }
}
但是当我对每一个都做了一些细微的改变来处理这样的索引时

ForEach(0..<viewModel.game.cards.count) { card in
    CardView(card: self.viewModel.game.cards[card])
}

ForEach(0..我只能回答你的问题,为什么它不再工作了:
它不再为更改设置动画,因为您的ForEach不再知道您洗牌了数组。Swift只看到标记,标记保持不变,以及数组的计数

如果您在ForEach中更改以下内容

Foreach(cards.indicies, id: \.self)
您将看到列表正在重新设置动画,但与以前不同,因为Forach只知道数组中的此元素已被替换,而不知道整个数组

编辑:这里有一个解决方案可能会对您有所帮助,但因为我不知道您希望通过getItem实现什么,所以我不确定它是否适合您的问题。我希望它能引导您朝着正确的方向前进

    struct TestView: View {
    @State var cards = [Card(), Card(), Card(), Card()]
    var cardsByIndex: [Card] {
        //getItemByIndexMethod
        var c = [Card]()
        for i in cards.indices {
            c.append(cards[i])
        }
        return c
    }
    
    var body: some View {
        VStack {
            ForEach(cardsByIndex) { card in
                CardView(card: card)
            }
            Button("Randomize") {
                withAnimation(.easeInOut) {
                    self.cards.shuffle()
                }
            }
        }
    }
}

struct CardView: View {
    let card: Card
    
    var body: some View {
        Text(card.name)
    }
}

struct Card: Identifiable {
    var id = UUID()
    let name = String("ABCDE".shuffled())
}

我可能错了,但这听起来很像swift UI Stanford课堂作业。也许可以问一个更一般的问题,而不是为此作业寻求帮助。问题在于唯一标识符,在第一种情况下,两个视图都是独立于顺序的唯一的,在第二种情况下,在切换它们未识别的索引后。@DerickMathews这确实是from Stanford课程,但不幸的是,我不是一名斯坦福学生,我在YouTube上观看了这门课程,所以这是唯一一个寻求帮助的地方。所以我不必做这个作业,我只是对这种行为感到好奇。我明白了。所以没有办法让它与索引一起工作?如果我有一个网格(hstask的Vstack)怎么办?我需要在那里按索引获取项目。不,我不认为你可以让它直接与索引一起工作,但我编辑了我的答案,以获得可能的解决方案。我希望它能帮助你。谢谢,我将检查它。我试图在网格中实现重新排序动画,当你洗牌它时。默认情况下,如果网格是hstacks的vstack,它将不起作用(在这种情况下,您需要2个对索引进行操作的foreach)。只有当网格中的项目按坐标手动布局时(元素上的一个foreach),它才起作用。无论如何,我认为使用swiftui2网格元素时,默认情况下它会起作用。