Animation 使用NavigationLink isActive时视图之间的动画不工作

Animation 使用NavigationLink isActive时视图之间的动画不工作,animation,swiftui,swiftui-navigationlink,Animation,Swiftui,Swiftui Navigationlink,我是从UIKit来到SwiftUI的,在显示新视图时,导航链接没有动画,这让我遇到了麻烦 我已将视图结构设置为在以下属性为非nil时包含NavigationLink: @State private var retrievedDeviceIdentity: Proteus.DeviceIdentity? Proteus.DeviceIdentity类型是一种基本数据结构。此属性由成功的异步闭包填充,而不是直接的用户交互。因此,视图结构是这样设置的,使用NavigationLink的目的地:isA

我是从UIKit来到SwiftUI的,在显示新视图时,导航链接没有动画,这让我遇到了麻烦

我已将视图结构设置为在以下属性为非nil时包含NavigationLink:

@State private var retrievedDeviceIdentity: Proteus.DeviceIdentity?
Proteus.DeviceIdentity类型是一种基本数据结构。此属性由成功的异步闭包填充,而不是直接的用户交互。因此,视图结构是这样设置的,使用NavigationLink的
目的地:isActive:标签:
初始化器:

var body: some View {
    NavigationView {
        VStack {
            Form {
                // Form building
            }
            
            if let deviceIdentity = retrievedDeviceIdentity {
                NavigationLink(
                    destination: AddDeviceLinkDeviceForm(deviceIdentity: deviceIdentity),
                    isActive: .constant(retrievedDeviceIdentity != nil),
                    label: {
                        EmptyView()
                    }
                )
                .onDisappear() {
                    updateSyncButtonEnabledState()
                }
            }
        }
    }
}
retrievedDeviceIdentity
被填充为非零时,新视图确实出现。但是,没有幻灯片过渡到该视图;它只是立即改变。在该新视图中,点击“上一步”按钮会将幻灯片切换回该视图

有没有办法解决这个问题?因为我对SwiftUI还很陌生,如果我把新的结构设置错了,那么我也欢迎反馈


(我在macOS Big Sur 11.0.1上使用的是Xcode 12.3。)

我认为这是由于条件注入,请尝试将其持久包含在视图层次结构中(并在
导航视图中注册),如


注意:我不确定您对.onDisappear的期望,以及您为什么需要它,可能需要移动到其他位置或在不同的修改器下。

@Asperi很接近,但移动导航链接导致视图根本不显示

如果
支架展开retrievedDeviceIdentity,则删除
的工作是:

var body: some View {
NavigationView {
    VStack {
        Form {
            // Form building
        }
        
        NavigationLink(
            destination: AddDeviceLinkDeviceForm(deviceIdentity: deviceIdentity),
            isActive: .constant(retrievedDeviceIdentity != nil),
            label: {
                EmptyView()
            }
        )
        .onDisappear() {
            updateSyncButtonEnabledState()
        }
    }
}

这需要将AddDeviceLink DeviceForm的
deviceIdentity
属性设置为可选,以接受包装的值。

谢谢!我有条件地添加它,因为
retrievedDeviceIdentity
需要展开才能传递到AddDeviceLinkDeviceForm初始值设定项中。根据您的逻辑,在该初始值设定项中强制展开
retrievedDeviceIdentity
是否安全?我会将其更改为可选,并在AddDeviceLinkDevice中处理。我已尝试更新我的代码以匹配您的代码,但现在根本没有显示新的视图。我确实发现,将代码放在我拥有的地方,但如果让deviceIdentity=RetrieveDeviceIdentity取消包装,则删除
,动画就能正常工作。
var body: some View {
NavigationView {
    VStack {
        Form {
            // Form building
        }
        
        NavigationLink(
            destination: AddDeviceLinkDeviceForm(deviceIdentity: deviceIdentity),
            isActive: .constant(retrievedDeviceIdentity != nil),
            label: {
                EmptyView()
            }
        )
        .onDisappear() {
            updateSyncButtonEnabledState()
        }
    }
}