- 导航视图和列表(11’48")

Build a table view with navigation options and presentations in SwiftUI.

在 SwiftUI 中使用导航选项和展示创建表格视图。

这一节内容依旧比较短,先新建一个 UpdateList.swift 文件。

1. 给导航视图创建数据模型

在 UpdateList 文件的末尾添加如下代码

// 模型
struct Update: Identifiable {
    var id = UUID()
    var image: String
    var title: String
    var text: String
    var date: String
}
// 数据
let updateData = [
    Update(image: "Card1", title: "SwiftUI 进阶", text: "使用 API 数据、包和 CMS 等高阶技术将 SwiftUI app 发布到 App Store", date: "10月17日"),
    Update(image: "Card2", title: "Webflow", text: "使用高级互动、支付和 CMS 设计高度转换加载页面和制作动画", date: "12月31日"),
    Update(image: "Card3", title: "ProtoPie", text: "为移动端和网络端制作带有高级动画和交互的原型", date: "8月21日"),
    Update(image: "Card4", title: "SwiftUI", text: "使用 Xcode 11 对自定义UI、动画、手势和组件进行编程", date: "3月9日"),
    Update(image: "Card5", title: "Framer Playground", text: "使用 Framer X 代码编辑器创建强大的动画和交互", date: "11月11日"),
    Update(image: "Card6", title: "测试一个内容比较长的", text: "红军不怕远征难,万水千山只等闲。五岭逶迤腾细浪,乌蒙磅礴走泥丸。金沙水拍云崖暖,大渡桥横铁索寒。更喜岷山千里雪,三军过后尽开颜。", date: "10月1日")
]

2. 建立导航视图

很简单,直接上代码了

NavigationView {                                                    // 导航视图
    List(updateData) { update in                                    // 更新信息列表,数据来自 updateData
		NavigationLink(destination: Text(update.text)) {            // 导航项目,目标为更新信息的详情
            HStack {
                Image(update.image)                                 // 使用数据中的属性
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(width: 80, height: 80)
                    .background(Color.black)
                    .cornerRadius(20)
                    .padding(.trailing, 4)
                VStack(alignment: .leading, spacing: 8) {
                    Text(update.title)
                    	.font(.system(size: 20, weight: .bold))
                    Text(update.text)
                        .lineLimit(2)
                        .font(.subheadline)
                    	.foregroundColor(
                            Color(#colorLiteral(red: 0.501960814, 
                                                green: 0.501960814, 
                                                blue: 0.501960814, alpha: 1)
                                 )
                        )
                    Text(update.date)
                        .font(.caption)
                        .fontWeight(.bold)
                        .foregroundColor(.secondary)
                        }
                    }
                    .padding(.vertical, 8)
                }
            }
        .navigationBarTitle(Text("课程更新信息"))                                     // 导航视图的标题
        }
    }
}

这样就完成了一个导航视图,页面顶端是 navigationBarTitle 修饰所给的标题。每条信息的概要在一行上显示,行末有 > 按钮,点击可以跳转到详情。详情页面有导航标题作为返回按钮。超过屏幕的部分可以向上滚动后显示。概要和详情相互切换时有内置的动画。下面是 NavigationLink 默认的创建代码。

NavigationLink(destination: Text("Destination")) {	// 目标文字
	Text("Navigate")								// 导航视图
}
//TODO:如果目标是视图该怎么办?

现在只是初步认识了导航视图,后面会陆续增加更深入的内容。

本节小结

本节代码请参见 GitHub 和 码云

  • NavigationView 负责包裹导航视图的内容
  • List 负责包裹一个列表
  • NavigationLink 负责包裹一个导航项目,其中 destination 指明目的显示内容,后面的尾随闭包是导航条的内容
  • navigationBarTitle 指明了组件的导航标题,注意这个修饰是加在 NavigationView 里面的组件上的,不是加在 NavigationView 上。
  • 重复练习了 数据模型,数据引用,颜色字面量和其他一些修饰器。
接下来

导航样式