SwiftUI--List View全攻略
SwiftUI的List View和UIKit中的UITableView很相似,它可以根據你的需求加載靜態或者動態數據。不同的是,List使用起來更加的簡單:我們不需要在storyboard或者Xib中創建cell,也不需要使用代碼注冊cell,不需要告訴它要有多少行內容,當然也不需要dequeue cell以及手動設置cell等等。
一、創建一個靜態數據列表
想要創建一個靜態數據列表,你首先需要確定每一個cell的樣式。我們可以自定義一個簡單的cell,代碼如下:
struct StreetRow: View {
var name: String
var body: some View {
Text("The street name is \(name)")
}
}
這樣我們就定義了一個簡單的cell,cell上只有一行文字,現在可以創建一個List View,并添加你需要的數量的cell,像這樣:
struct ListViewDemo: View {
var body: some View {
List{
//當然可以有多種不同的Row哦
StreetRow(name: "The Lodon Street")
StreetRow(name: "The Joe's Street")
StreetRow(name: "The House Street")
}
}
}
這樣就創建了一個最簡單的列表,這里不得不說swiftUI確實是強大,短短幾行代碼就可以創建出UITableView需要書寫大量代碼才能看到的效果。
二、創建一個動態數據列表
如果想動態的生成items,比如根據接口返回的數據生成列表,就需要用到動態列表。按照UIKit中的習慣,首先我們需要一個model存儲這些數據,SwiftUI也類似,我們需要創建一個Street的結構體,并遵循Identifiable協議,此協議中只有一個必須的屬性:id,它用來讓SwiftUI區分不同的item。
struct Street: Identifiable {
var id = UUID()
var name: String
}
這里我們給id初始化為UUID():
UUID: which can be used to uniquely identify types, interfaces, and other items.
UUID可以被用來作為不同item的標記,這樣swiftUI就知道當前是哪個
接下來需要修改StreetRow的內容:
struct StreetRow: View {
var street: Street
var body: some View {
Text("The street name is \(street.name)")
}
}
最后在準備我們需要的數據,并讓其動態加載到頁面上,實際開發中往往是從接口返回的數據,這里準備了幾條假數據來說明使用:
struct ListViewDemo: View {
var body: some View {
let street1 = Street(name: "The Lodon Street")
let street2 = Street(name: "The Joe's Street")
let street3 = Street(name: "The House Street")
//數據數組
let streets = [street1, street2, street3]
return List(streets){ street in
StreetRow(street: street)
}
}
}
SwiftUI會根據streets數組中的數據每次執行閉包創建cell,最終顯示頁面。其實針對這種情況下還有更簡單的創建List的方式:
return List(streets, rowContent: StreetRow.init)
實際上List有很多的創建的方式,剩下的大家可以慢慢探索哦。
三、設置左滑刪除cell
struct ListViewDemo: View {
//數據數組
@State private var streets = [Street(name: "The Lodon Street"), Street(name: "The Joe's Street"), Street(name: "The House Street")]
var body: some View {
func deleteRow(at offsets:IndexSet) {
streets.remove(atOffsets:offsets)
}
return List{
ForEach(streets, id: \.self) { street in
StreetRow(street: street)
}.onDelete(perform: deleteRow)
}
}
}
實現起來是不是很簡單,但是需要注意的是:使用ForEach結構體,需要保證street遵守Hashable協議:
struct Street: Identifiable,Hashable {
var id = UUID()
var name: String
}
這里你可能會好奇,刪除掉cell后數據是怎么同步并實時更新頁面的,我們注意到數據源streets使用了@State修飾,這就是數據綁定,后面的章節會有專門的講解哦。
四、List添加section分組以及設置grouped類型
struct ListViewDemo: View {
var body: some View {
return List{
Section(header:Text("some streets one"), footer: Text("Fotter1")){
TaskRow()
TaskRow()
TaskRow()
}
Section(header:Text("some streets two"), footer: Text("Fotter2")){
TaskRow()
TaskRow()
TaskRow()
}
}
}
}
struct TaskRow: View {
var body: some View {
Text("Task data goes here")
}
}
和UITableView一樣,你可以讓數據分組顯示,并為每一個section添加header和fotter,效果如下:
在UITableView中我們可以設置plain和grouped兩種樣式,而默認是plain樣式,SwiftUI也一樣。在swiftUI中設置grouped樣式很簡單,只需要為list添加相應的listStyle modifier:
struct ListViewDemo: View {
var body: some View {
return List{
Section(header:Text("some streets one"), footer: Text("Fotter1")){
TaskRow()
TaskRow()
TaskRow()
}
Section(header:Text("some streets two"), footer: Text("Fotter2")){
TaskRow()
TaskRow()
TaskRow()
}
}.listStyle(GroupedListStyle())
}
}
效果如下:
五、點擊cell跳轉的實現
首先需要新建一個詳情頁ListViewDetial,因為只是演示跳轉,所以里面使用默認的代碼。
struct ListViewDemo: View {
var body: some View {
let streets = [
Street(name: "The Lodon Street"),
Street(name: "The Joe's Street"),
Street(name: "The House Street")
]
return NavigationView{
List(streets){ street in
NavigationLink(destination:ListViewDetial()){
StreetRow(street: street)
}
}.navigationBarTitle("Streets")
}
}
}
實現跳轉的重點是:List包裹在NavigationView中,并且cell也需要包裹進NavigationLink中,并設置destination屬性,其他的和上面介紹的沒有區別。
好了,本篇文章介紹了swiftUI中List的創建,使用,設置以及點擊跳轉,基本包含了List的日常使用。每天進步一點點,成為更好的自己!有問題歡迎留言交流,歡迎關注!
歡迎關注公眾號:iOS進化論,里面全部是iOS知識的干貨,最近在做SwiftUI系列,歡迎大家和我一起追趕技術潮流,勇往直前!
智能推薦
Android 劉海屏適配全攻略
0.版權聲明 本文由玉剛說寫作平臺提供寫作贊助,版權歸玉剛說微信公眾號所有 原作者:四月葡萄 版權聲明:未經玉剛說許可,不得以任何形式轉載 1.前言 先吐槽一下,劉海屏真丑。然而作為苦逼的開發者,還是要去適配劉海屏的。好了,吐槽完畢,進入正題。 這里主要是介紹一下Android P中劉海屏的適配以及Android P之前的適配。為什么要分開呢?因為Android P之前官方還沒提供API來進行適配...
ZABBIX環境部署全攻略
1. 環境部署 1.1 基礎環境說明 1.2 修改時間格式 1.3 安裝nginx環境,并安裝依賴包 1.3.1 編譯安裝nginx 1.3.2 添加nginx用戶 1.3.3 修改nginx 配置文件 1.3.4 修改nginx 快捷方式并關閉防火墻 1.3.5 訪問nginx web頁面 1.4 安裝mysql 1.4.1 刪除舊數據庫 1.4.2 編譯安裝mysql 1.4.3 添加mysq...
JavaScript語句完全攻略(總結)
JavaScript語句完全攻略 JavaScript 語言定義了 20 套(或個)語句命令,分別執行不同的操作。 以用途劃分,JavaScript 語句可以分為:聲明、分支控制、循環控制、流程控制異常處理和其他。 以結構劃分,JavaScript 語句又可以分為單句和復句。 單句:也稱單行語句,由一個或多個關鍵字和表達式構成,用來完成簡單的運算。 復句:使用大括號包含一個或多個單句,用來設計代碼...
Java數組全攻略(一)
數組 是一個容器 保存數據 保存相同數據類型的數據 數組的寫法 數據類型[] 數組名 = 初值; 其中數據類型代表數組中盛放數據的 數據類型 int[] array = new int[5]; //聲明一個長度為5的整型數組數組長度一旦確定就無法修改. 數組使用下標(角標)來訪問或保存元素 下標從零開始 int[] array = new int[] {1, 2, 3, 4, 5}; 關于數組的一...
Java數組全攻略(三)
二維數組 也是一個容器 保存 相同數據類型的一維數組 數據類型 [][] 數值名 = 初值; 代碼示例: 二維數組在內存中的表現形式 三維數組 三維數組 保存多個相同數據類型的 二維數組 代碼示例: 二維數組迷宮問題...
猜你喜歡
阿里云 部署django全攻略
1.登錄root用戶在系統下新建用戶 2. 為新用戶(zhaozhao)添加密碼(默認創建的用戶沒有密碼) 3.為新用戶添加sudo權限 4.退出root用戶,用新賬戶重新登錄Linux 5.在用戶根目錄下新建項目目錄(如果登錄后控制鍵亂碼,輸入bash,然后回車即可!) 支持中文sudo locale-gen zh_CN.UTF-8 6.安裝python環境(大多數ubuntu自帶,python...
Spark 本地提交、WebUI全攻略
本地提交: Local提交方式主要用于快速入門,開發階段測試。用該模式提交,開箱即用,不用啟動Spark的Master、Worker守護進程( 只有集群的Standalone方式時,才需要這兩個角色),也不用啟動Hadoop的各服務(除非你要用到HDFS) 提交命令: 提交java 提交python 這個SparkSubmit進程又當爹、又當媽,既是客戶提交任務的Client進程、又是Spark的...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...