如果它不可见,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) - 它有啥作用以及如何使它不可见(或等效)?

CSS如何使div在焦点上可见不起作用

SwiftUI 水平 ScrollView 具有不可见的填充

在 SwiftUI 中,如何使手势在容器视图之外处于非活动状态?

JSON 列表在 SwiftUI 中不可见

如何使日期选择器可见?