SwiftUI直通车系列(3)—— 使用导航

简介: SwiftUI直通车系列(3)—— 使用导航

关于SwiftUI,我们前两篇博客介绍了独立组件的布局与属性设置相关内容,并且介绍了开发中最常用的列表视图的使用。但是一个完整的应用程序不可能是单界面的,如何使用SwiftUI进行界面间的导航跳转,是我们本博客讨论的重点。前两篇博客地址如下:


SwiftUI直通车系列(1)—— 视图的布局与组织https://my.oschina.net/u/2340880/blog/4529951


SwiftUI直通车系列(2)—— 列表视图https://my.oschina.net/u/2340880/blog/4534222


   在本系列的第二篇博客中,我们能够使用SwiftUI来构建列表视图,通常,列表视图用来展示目录页面,当用户点击列表中的某一项时,需要跳转到详情页。在iOS应用中,页面的跳转常用导航控制器进行管理。在SwiftUI中,创建一个导航也是非常简单的,只需要在组件最外层嵌套NavigationView即可。以我们之前的列表视图Demo为例,改写代码如下:


import SwiftUI

import UIKit


struct ContactModel {

   var name:String

   var phone:String

}


let modelData = [

   ContactModel(name:"王小丫", phone:"15137348888"),

   ContactModel(name:"李小二", phone:"15137348989")

]


struct ContentView: View {

 

   var body: some View {

       VStack (alignment: .leading, spacing: 10) {

           Text("Hello, SwiftUI!啊啊啊")

               .foregroundColor(Color.red)

               .underline()

               .font(Font.system(size: 25))

           Spacer()

           Text("Hello, SwiftUI!")

           .foregroundColor(Color.red)

           .underline()

           .font(Font.system(size: 25))

       }

       .padding(EdgeInsets(top: 30, leading: 0, bottom: 30, trailing: 0))

   }

}


struct Label:UIViewRepresentable {

   func makeUIView(context: Context) -> UILabel {

       UILabel(frame: .zero)

    }

 

   func updateUIView(_ uiView: UILabel, context: Context) {

       uiView.text = "Hello"

   }

}



struct ContentImage:View {

   var body: some View {

       Image("demo")

       .clipShape(Circle())

       .shadow(radius: 30)

   }

}


struct RowContent:View {

 

   var contactModel:ContactModel

 

   var body: some View {

       HStack(alignment:.top) {

           Image("demo").resizable().frame(width: 70, height: 70)

           VStack(alignment:.leading, spacing: 10) {

               Text(self.contactModel.name).bold().font(Font.system(size: 25))

               Text(self.contactModel.phone).font(Font.system(size: 20))

           }

           Spacer()

           }.padding(EdgeInsets(top: 10, leading: 20, bottom: 10, trailing: 20))

   }

}


struct ListContent:View {

   var body: some View {

       NavigationView {

           List(modelData, id: \.name) { model in

               RowContent(contactModel: model)

           }

           .navigationBarTitle("通讯录")

       }

   }

}


struct ContentView_Previews: PreviewProvider {

   static var previews: some View {

       ListContent()

   }

}

你只需要关注ListContent结构体即可,其中为列表视图设置了导航,并且定义了导航栏上的标题,效果如下图:

image.png



要实现页面的跳转,需要为要触发跳转的组件添加NavigationLink包裹,NavigationLink可以指向要跳转的详情页面,如下:


struct ListContent:View {

   var body: some View {

       NavigationView {

           List(modelData, id: \.name) { model in

               NavigationLink(destination: ContentImage()) {

                   RowContent(contactModel: model)

               }

           }

           .navigationBarTitle("通讯录")

       }

   }

}

如果详情页面是动态的,在跳转时,我们也可以将数据传递过去,如下:


struct ContentImage:View {

   var name:String

   var phone:String

   var body: some View {

       VStack() {

           Image("demo")

               .clipShape(Circle())

               .shadow(radius: 30)

               .offset(x: 0, y: -70)

           Text(name).offset(x: 0, y: -50)

           Text(phone).offset(x: 0, y: -30)

       }

   }

}


struct ListContent:View {

   var body: some View {

       NavigationView {

           List(modelData, id: \.name) { model in

               NavigationLink(destination: ContentImage(name: model.name, phone: model.phone)) {

                   RowContent(contactModel: model)

               }

           }

           .navigationBarTitle("通讯录")

       }

   }

}

效果如下图所示:


image.png


默认导航的标题是大文字风格的,若要使用常规风格的,需要配置其displayMode属性,如下:


struct ListContent:View {

   var body: some View {

       NavigationView {

           List(modelData, id: \.name) { model in

               NavigationLink(destination: ContentImage(name: model.name, phone: model.phone)) {

                   RowContent(contactModel: model)

               }

           }

           .navigationBarTitle("通讯录", displayMode: .inline)

       }

   }

}

效果如下图所示:

image.png

目录
相关文章
|
11月前
|
存储 数据管理 数据库
CoreData 在 swift UI 中的使用
当谈到在 Swift UI 中进行本地数据持久化,Core Data 是一个强大且常用的解决方案。Core Data 是苹果提供的一种数据存储和管理框架,用于在应用程序中创建、读取、更新和删除数据。它提供了一个对象图管理器,可以将数据映射到对象,并提供了一种简化数据操作的方式。在本文中,我们将深入介绍 Core Data 在 Swift UI 中的使用。
CoreData 在 swift UI 中的使用
SwiftUI 面面观
前言 Swift 5.1 新语法 单表达式隐式返回值 根据结构体默认成员合成默认初始化器 字符串插入运算符新设计 属性包装器 不透明返回类型 Swift Style DSL / Function Builder 其他新特性 Swift 从 3.x Attribute Swift/SwiftUI API Design Guide 值类型和引用类型
1478 0
SwiftUI直通车系列(6)—— 使用动画
SwiftUI直通车系列(6)—— 使用动画
190 0
|
前端开发 安全 程序员
详解 WWDC 20 SwiftUI 的重大改变及核心优势
随着 WWDC 20 相关新特性和介绍视频的释出,都明确的宣告着 SwiftUI 元年已经到了,SwiftUI 已经成长为新时代的布局引擎。 以下从几个方面分享关于 SwiftUI 的重大改变及核心优势。
2908 0
详解 WWDC 20 SwiftUI 的重大改变及核心优势
|
前端开发 Swift
Swift UI对Flutter的意义;JSConf 2019归来记;未来属于声明式编程丨体验科技精选第 4 期
这里是蚂蚁金服体验科技精选 第 4 期,本期内容包括原创精选、蚂蚁前端动态和行业动态,内涵福利。
5380 0
Swift UI对Flutter的意义;JSConf 2019归来记;未来属于声明式编程丨体验科技精选第 4 期
|
前端开发 Android开发 开发者
SwiftUI 初体验
前言 苹果在 WWDC 2019 的开幕式中给我们来带了超多的惊喜,全新的iPad OS, 给生产力和商业带来了新领域,iOS 项目可以通过简单的修改移植到 Mac OS 上,全新的 Mac Pro 高清的显示器等新硬件,但对于在苹果平台的开发者们,最重要的莫过于 Swift UI。
5949 0
|
Swift
swift UI专项训练8 展示数据
  现在我想要点击表单中的条目,进行标记,再次点击以取消,那么该如何做呢?依然使用的是tableView的重载方法,在 Restaurant中新增一个isCollected的值表示是否收藏,...
879 0
|
Swift
swift UI专项训练9 添加数据
  今天我们来实现新增数据的功能。在新增餐馆的控制器中初始化一个类: var restaurant = Restaurant() 接着创建关联,按住control键选择done按钮拖拽到控制器代码中: 会自动生成如下代码: @IBOutlet weak var doneButton: UIBarButtonItem! 同理把文本框也拖过去。
836 0
|
Swift
swift UI专项训练10 视图共性
   讲到视图,先来看看视图的内容:    1.视图的实现:视图的基类是UIView    2.视图的Mode:尺寸填充模式,就是当尺寸超过了我们设定的值的时候采取什么适合屏幕的填充方式。
732 0
swift UI专项训练11 ActionSheet
        ActionSheet字面意思是动作表,那么它有什么用呢?它就是一个菜单,上面有很多选择,让用户选择或者取消,取消按钮式必须有的。
875 0