成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何讓 SwiftUI 的列表變得更加靈活

開發 前端
List 可能是 SwiftUI 附帶的內置視圖中最常用的一種,它使我們能夠在任何 Apple 平臺上呈現“類似于表格視圖”的用戶界面。今年,List 獲得了許多非常重要的升級,使其更加靈活和易于定制。讓我們看看都有哪些新功能。

[[417780]]

前言

List 可能是 SwiftUI 附帶的內置視圖中最常用的一種,它使我們能夠在任何 Apple 平臺上呈現“類似于表格視圖”的用戶界面。今年,List 獲得了許多非常重要的升級,使其更加靈活和易于定制。讓我們看看都有哪些新功能。

作為起點,假設我們正在處理以下 ArticleList 視圖,該視圖使用 ArticleListViewModel 來呈現文章列表:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List(viewModel.articles) { article in 
  6.             NavigationLink( 
  7.                 destination: ArticleView(article: article), 
  8.                 label: { 
  9.                     VStack(alignment: .leading) { 
  10.                         Text(article.title) 
  11.                             .font(.headline) 
  12.                         Text(article.description) 
  13.                             .foregroundColor(.secondary) 
  14.                     } 
  15.                 } 
  16.             ) 
  17.         } 
  18.     } 

上面的內容目前是使用 SwiftUI 中初版的概念和 API 編寫的,下面讓我們嘗試使用新功能來為我們的列表實現自定義樣式,并且使代碼更加健壯。

使用新速記語法

讓我們從一個很小的特性開始,這是一個非常受歡迎的變化,可以使用類似 enum 的速記語法來引用 SwiftUI 附帶的任何內置 ListStyle 類型。比如,如果我們想將 “inset grouped” 樣式應用于列表中,我們不需要拼出整個 InsetGroupedListStyle 名稱,而是可以簡單地將其稱為 .insetGrouped:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List(viewModel.articles) { article in 
  6.             ... 
  7.         } 
  8.         .listStyle(.insetGrouped) 
  9.     } 

這樣的改變還是非常好的,可以讓我們的開發更加方便,閱讀時感覺更加自然。

元素綁定和自定義滑動操作

接下來,讓我們看看如何將完全自定義的滑動操作添加到列表中。為了演示這種情況,我們在 List 中嵌套一個 ForEach (因為在 SwiftUI 的中,列表變化一版都是由 ForEach 觸發的,而不是由 List 觸發的)。然后,讓我們使用另一個新功能,集合元素綁定,讓系統自動為我們的 articles 數組中的每個元素創建一個可變綁定:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List { 
  6.             ForEach($viewModel.articles) { $article in 
  7.                 ... 
  8.             } 
  9.         } 
  10.         .listStyle(.insetGrouped) 
  11.     } 

注意:關于上述創建集合元素綁定的新方法,即使我們的應用程序在較舊的操作系統版本上運行,也是沒有問題的。完全向后兼容!

由于每個 article 值在 ForEach 閉包中都是可變的,我們可以使用新的 swipeActions 修飾符來實現每個 NavigationLink 項目視圖的自定義滑動操作。在這種情況下,用戶可以輕松的在項目視圖上滑動來決定喜不喜歡對應的文章:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List { 
  6.             ForEach($viewModel.articles) { $article in 
  7.                 NavigationLink( 
  8.                     ... 
  9.                 ) 
  10.                 .swipeActions { 
  11.                     Button( 
  12.                         action: { 
  13.                             article.isFavorite.toggle() 
  14.                         }, 
  15.                         label: { 
  16.                             if article.isFavorite { 
  17.                                 Label("Remove from favorites"
  18.                                     systemImage: "star.slash" 
  19.                                 ) 
  20.                             } else { 
  21.                                 Label("Add to favorites"
  22.                                     systemImage: "star" 
  23.                                 ) 
  24.                             } 
  25.                         } 
  26.                     ) 
  27.                     .tint(article.isFavorite ? .red : .green) 
  28.                 } 
  29.             } 
  30.         } 
  31.         .listStyle(.insetGrouped) 
  32.     } 

這里還可以使用新的 tint 修飾符根據喜歡還是不喜歡滑動動作來設置自定義顏色。

下拉刷新

就我個人而言,下拉刷新在我的 SwiftUI 功能請求列表中非常重要,所以我很高興看到今年的版本增加了對這種非常常見的 UI 范式的內置支持。

不僅如此,下拉刷新是由 async/await 提供支持,不需要增加任何額外的代碼就可以讓系統知道什么時候重新加載結束。在列表中使用 refreshable 修飾符就可以完成,然后使用該修飾符的閉包 await 調用視圖模型的異步 reload 方法:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List { 
  6.             ... 
  7.         } 
  8.         .listStyle(.insetGrouped) 
  9.         .refreshable { 
  10.             await viewModel.reload() 
  11.         } 
  12.     } 

要了解有關 async/await 的更多信息以及如何在 SwiftUI 中使用,請查看昨天的這篇文章[1],不要錯過真正重要的“在 Swift 中認識 async/await[2]”WWDC 會議。

由于系統會自動檢測知道 viewModel.reload() 何時調用完成,因此可以防止發生重復的刷新操作,并且可以更具狀態顯示和隱藏相應 UI。

可定制的分隔符

自從引入 SwiftUI 以來,開發者們有一個非常普遍的要求,提供一個 API ,用于隱藏或以其他自定義實現列表中每個 item 之間的默認分隔符。

很高興地告訴你,今年 Apple 已經響應了這個請求,我們可以使用新的 listRowSeparator 修飾符來完全隱藏不想呈現的分隔符:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List { 
  6.             ForEach($viewModel.articles) { $article in 
  7.                 NavigationLink( 
  8.                     ... 
  9.                 ) 
  10.                 .swipeActions { 
  11.                     ... 
  12.                 } 
  13.                 .listRowSeparator(.hidden) 
  14.             } 
  15.         } 
  16.         ... 
  17.     } 

由于上述修飾符是在每個列表的 item 上調用的,而不是在列表本身上調用,這為我們提供了很大的靈活性,可以根據想要構建的 UI 類型動態隱藏或顯示每個分隔符。

還有另外一個 API 用于控制部分分隔符的外觀顏色,可以使用自定義顏色為分隔符設置顏色——代碼如下:

  1. struct ArticleList: View { 
  2.     @ObservedObject var viewModel: ArticleListViewModel 
  3.  
  4.     var body: some View { 
  5.         List { 
  6.             ForEach($viewModel.articles) { $article in 
  7.                 NavigationLink( 
  8.                     ... 
  9.                 ) 
  10.                 .swipeActions { 
  11.                     ... 
  12.                 } 
  13.                 .listRowSeparatorTint(.blue) 
  14.             } 
  15.         } 
  16.         ... 
  17.     } 

同樣,由于上述修飾符是在每個列表的 item 上調用的,可以為不同的分隔符設置不同的顏色。

總結

SwiftUI 正在變得更加靈活和強大,后面我將繼續探索更多新推出的 API。

譯自 How SwiftUI’s List is becoming much more flexible this year[3]

參考資料

[1]Calling async APIs from a synchronous context:

https://wwdcbysundell.com/2021/calling-async-apis-from-synchronous-contexts/

[2]在 Swift 中認識 async/await:

https://developer.apple.com/videos/play/wwdc2021/10132/

[3]How SwiftUI’s List is becoming much more flexible this year:

https://wwdcbysundell.com/2021/exploring-new-swiftui-list-apis/#new-shorthand-syntax-for-applying-styling-protocols

本文轉載自微信公眾號「 Swift社區」,可以通過以下二維碼關注。轉載本文請聯系 Swift社區公眾號。

 

責任編輯:姜華 來源: Swift社區
相關推薦

2015-12-02 09:37:24

數據中心數據中心優化

2019-07-19 08:38:55

物聯網智慧城市智能照明

2024-01-11 14:42:20

人工智能機器學習算法

2021-01-04 12:03:04

人工智能AI物聯網

2013-11-29 16:54:27

Windows 8制造業智能化

2014-08-01 09:50:39

Oracle營銷云Oracle Eloq

2021-06-24 15:43:37

數據中心遠程工作優化數據中心

2015-04-02 10:04:28

Portal認證深信服

2018-02-05 00:01:41

2010-04-16 17:51:01

CTO

2023-08-23 15:49:10

數據中心

2010-08-06 10:30:53

配置VLANHyper-V

2020-03-09 10:09:18

混合云云計算

2011-01-25 22:13:29

云計算防災

2021-01-14 09:59:07

JS代碼編碼

2010-08-06 10:36:54

VLAN配置Hyper-V

2020-05-21 08:53:12

Python技術代碼

2011-05-20 15:39:08

2021-12-02 14:27:24

區塊鏈供應鏈管理SCM

2020-03-06 05:31:31

物聯網智慧城市IOT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区电影视频在线观看 | 欧美一区二区三区在线观看 | 国产日韩在线观看一区 | 91免费在线视频 | 免费的日批视频 | 成人中文字幕在线观看 | 国产资源一区二区三区 | 日日摸日日碰夜夜爽2015电影 | 亚洲欧美日本在线 | 成人av在线大片 | 国产精品一区二区久久久久 | 国产在线中文字幕 | 国产免费一区二区三区 | 国产精品美女久久久久久免费 | 国产精品入口麻豆www | av中文字幕在线观看 | 亚洲国产成人精品一区二区 | 伊人精品视频 | 国内精品伊人久久久久网站 | 精品久久久久久久久久久久久久 | 国产在线精品一区 | 久久久久国产一区二区三区不卡 | 欧美精品福利 | 中文字幕一区二区三区四区五区 | 亚洲一区二区三区 | 无码一区二区三区视频 | 色婷婷精品久久二区二区蜜臂av | 欧美日韩18 | 午夜精品久久久久久久久久久久 | 亚洲欧美激情精品一区二区 | 日本精品在线播放 | 欧美黄色小视频 | 一级特黄a大片 | 看片网站在线 | 麻豆毛片 | 美女视频网站久久 | 91av视频| 91亚洲欧美 | 精品国产一二三区 | 一区二区免费在线视频 | 欧美日韩国产一区二区三区 |