如果它不可见,SwiftUI 如何使 NavigationLink 工作?
Posted
技术标签:
【中文标题】如果它不可见,SwiftUI 如何使 NavigationLink 工作?【英文标题】:How to make NavigationLink work if it is not visible, SwiftUI? 【发布时间】:2021-01-31 21:48:29 【问题描述】:在 ForEach 之后在视图底部使用 NavigationLink 时,如果它不可见,它将无法工作。
我有一个按钮列表。如果按下按钮,它会将 Bool 设置为 true。这个布尔值现在显示了一个 NavigationLink,它会立即激活,因为传递的绑定设置为 true。 但是,如果数组太长,则链接将不起作用,因为一旦按下第一个按钮,它将看不见。
这是我的代码:
import SwiftUI
struct TestLinkView: View
@State private var linkIsActive = false
var body: some View
NavigationView
VStack
Button(action:
linkIsActive = true
)
Text("Press")
NavigationLink(destination: ListView(linkIsActive: $linkIsActive), isActive: $linkIsActive)
Text("Navigation Link")
struct ListView: View
var nameArray = ["Name1","Name2","Name3","Name4","Name5","Name6","Name7","Name8","Name9","Name10","Name11","Name12","Name13","Name14","Name15","Name16","Name17","Name18","Name19","Name20" ]
@State private var showLink: Bool = false
@State private var selectedName: String = ""
@Binding var linkIsActive: Bool
var body: some View
Form
ForEach(nameArray, id: \.self) name in
Button(action:
selectedName = name
showLink = true
)
Text(name)
if showLink
NavigationLink(destination: NameView(selectedName: selectedName), isActive: $linkIsActive)
EmptyView()
.navigationBarTitle("ListView")
struct NameView: View
var selectedName: String
var body: some View
Text(selectedName)
.navigationBarTitle("NameView")
可行的方法是在按钮标签内传递带有 if 条件的 NavigationLink。但是,如果我这样做,动画将不再起作用。
【问题讨论】:
【参考方案1】:Form 中不需要它,这就像 List 不会在可见区域之外创建视图。在您的情况下,解决方案是将链接移动到表单的背景中(因为它不依赖于表单内部)。
以下测试与 Xcode 12 / ios 14 一起使用。
Form
ForEach(nameArray, id: \.self) name in
Button(action:
selectedName = name
showLink = true
)
Text(name)
.background(Group
if showLink
NavigationLink(destination: NameView(selectedName: selectedName), isActive: $linkIsActive)
EmptyView()
)
【讨论】:
哪个动画?经过测试,导航动画效果很好。 问题是我在 NavigationView 中有.navigationViewStyle(StackNavigationViewStyle())
。谢谢你的回答!以上是关于如果它不可见,SwiftUI 如何使 NavigationLink 工作?的主要内容,如果未能解决你的问题,请参考以下文章
C++ MessageBox (Windows.h) - 它有啥作用以及如何使它不可见(或等效)?
SwiftUI 水平 ScrollView 具有不可见的填充