在SwiftUI中显示NavigationLink时,过渡动画消失了

时间:2020-05-24 15:39:50

标签: ios swift swiftui swiftui-navigationlink

我有一个带有NavigationLinks的列表。

List {
    ForEach(items, id: \.id) { item in
        NavigationLink(destination: ItemView(), tag: item.id, selection: self.$viewModel.selectedItemId) {
            Text("Some text")
        }
    }
    .onDelete(perform: delete)
}
.id(UUID())

还有一个对应的ViewModel,用于存储所选项目的ID。

class ViewModel: ObservableObject {
    @Published var selectedItemId: String? {
        didSet {
            if let itemId = selectedItemId {
                ...
            }
        }
    }
    ...
}

问题是当我使用NavigationLink(destination:tag:selection:)时,过渡动画消失了-子视图立即弹出。当我使用NavigationLink(destination:)时,它可以正常工作,但由于选择了NavigationLink时需要执行一些操作,因此无法使用它。

为什么过渡动画不见了? NavigationLink(destination:tag:selection:)有问题吗?

2 个答案:

答案 0 :(得分:2)

您可以将操作放入NavigationLink中。这应该可以解决您的动画问题:

List {
    ForEach(items, id: \.id) { item in
        NavigationLink(destination: ItemView(), isActive: $isActive, tag: item.id, selection: self.$viewModel.selectedItemId) {
            EmptyView()
        }
        Button(action: {
            // The action you wand to have done, when the View pops.
            print("Test")
            self.isActive = true
        }, label: {
            Text("Some text")
        })
    }
    .onDelete(perform: delete)
}
.id(UUID())

答案 1 :(得分:0)

事实证明,列表末尾的.id(UUID())有问题。删除它会恢复过渡动画:

List {
    ForEach(items, id: \.id) { item in
        NavigationLink(destination: ItemView(), tag: item.id, selection: self.$viewModel.selectedItemId) {
            Text("Some text")
        }
    }
    .onDelete(perform: delete)
}
//.id(UUID()) <- removed this line

我在此链接How to fix slow List updates in SwiftUI之后添加了此内容。使用NavigationLink(destination:tag:selection:)时,这种骇客会弄乱标签/选择。