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

Posted

技术标签:

【中文标题】在 SwiftUI 中显示 NavigationLink 时过渡动画消失了【英文标题】:Transition animation gone when presenting a NavigationLink in SwiftUI 【发布时间】:2020-05-24 15:39:50 【问题描述】:

我有一个带有 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:) 的问题吗?

【问题讨论】:

【参考方案1】:

您可以将您的操作放在 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())

【讨论】:

谢谢。我赞成您的回答,尽管这是一种解决方法,而不是直接的解决方案。【参考方案2】:

原来是列表末尾的.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 之后添加了此内容。看起来这个 hack 在使用 NavigationLink(destination:tag:selection:) 时会弄乱标签/选择。

【讨论】:

以上是关于在 SwiftUI 中显示 NavigationLink 时过渡动画消失了的主要内容,如果未能解决你的问题,请参考以下文章

如何始终在 SwiftUI 中显示键盘

SwiftUI:按名称分组数据并显示在展开列表中

如何在 SwiftUI 列表中显示 MPMediaItem 图稿?

SwiftUI - 从回调中分配一个值,显示在视图中

在 SwiftUI 中分组列表数据以分段显示

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?