NavigationView & NavigationLink in SwiftUI

784 阅读2分钟

在SwiftUI中,NavigationView和NavigationLink用于实现视图之间的导航和跳转。

NavigationView:

  • 用于构建一个导航界面结构,内部可以放置多个视图
  • 会自动渲染一个Navigation Bar
  • 支持多级导航,可以推入(push)和弹出(pop)视图

使用方式:

NavigationView {
  // 根视图
  
  NavigationLink {
    // 下一个视图
  } label: {
    // 链接标签
  }
}

NavigationLink:

  • 定义在NavigationView内部的一个导航链接
  • 点击后会推入一个新的视图到导航栈
  • label属性定义点击区域,destination属性定义跳转的视图

特征:

  • 支持后退手势返回
  • 可以通过isActive状态控制激活
  • 支持传递绑定数据到下一个视图

综上,NavigationView和NavigationLink用于构建导航流程,点击NavigationLink可以顺畅地在视图间跳转导航。

下面看具体例子

image.png

上述示例中,使用NavigationView构建来一个列表。我们可以设置TitleDisplayModel, 它有三个值,分别为:

  • automatic
  • inline
  • large

效果如下:从左到右分别为 automatic -> inline -> large

image.png

当我们点击第一个蓝色的HELLO时,会导航到一个新的页面

我们现在把NavigationLink的destination值改成SecondView()。 代码如下

NavigationViewSample 代码:

struct NavigationViewSample: View {
    
    var body: some View {
        NavigationView {
            ScrollView {
                NavigationLink("HELLO", destination: SecondView())
                Text("HELLO")
                Text("HELLO")
                Text("HELLO")
            }
            .navigationTitle("All Items")
            .navigationBarTitleDisplayMode(.automatic)
        }
    }
}

SecondView 代码:

struct SecondView: View {
    
    @Environment(.dismiss) var dismiss
    
    var body: some View {
        ZStack {
            Color.mint
                .edgesIgnoringSafeArea(.all)
                .navigationTitle("Second View")
                .navigationBarHidden(true)
            
            VStack {
                Button("BACK") {
                    dismiss()
                }
                
                NavigationLink("Click", destination: Text("Three screen"))
            }
        }
        .foregroundStyle(Color.black)
    }
}

1_Ip2sj3Fm23MpfvdqnS4RqQ.gif

注意:

  1. 在整个app中,只需要一个NavigationView,不要使用多个。
  2. 父类使用了NavigationView,那么我们可以直接在子类中来修改NavigatoinView的属性。在SecondView中我们就使用了隐藏属性,隐藏了NavigationBar。在SecondView中还可以继续使用NavigationLink,它会继续导航到下一层级页面。

如何添加NavigationBar button

只需要把代码添加到NavigationView的内部,就可以实现。根据需求,你可以自行添加左边或右边的按钮。这里都可以使用自定义方式来实现

struct NavigationViewSample: View {
    
    var body: some View {
        NavigationView {
            ScrollView {
                NavigationLink("HELLO", destination: SecondView())
                Text("HELLO")
                Text("HELLO")
                Text("HELLO")
            }
            .navigationTitle("All Items")
            .navigationBarTitleDisplayMode(.automatic)
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Image(systemName: "heart.fill")
                        .foregroundStyle(.red)
                }
                
                ToolbarItem(placement: .navigationBarTrailing) {
                    NavigationLink(destination: SecondView()) {
                        Image(systemName: "gear")
                            .tint(Color.black)
                    }
                }
            }
        }
    }
}

以下就是效果,左边和右边分别添加了两个button

image.png

基本介绍就这么多,需要注意的是:系统的方法会在不断的系统升级中会过期, 在写法上有的会有一些差异。当方法不可用,请查阅最新的API。

对于今天的内容,大家有什么看法呢?欢迎留言讨论。
公众号:RobotPBQ