Animation 使用NavigationLink isActive时视图之间的动画不工作
我是从UIKit来到SwiftUI的,在显示新视图时,导航链接没有动画,这让我遇到了麻烦 我已将视图结构设置为在以下属性为非nil时包含NavigationLink: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
@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()
}
}
}