五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Data Flow Through SwiftUI - SwiftUI 中的數(shù)據(jù)流

2021-03-29 18:17 作者:js-john  | 我要投稿

摘要

如何讓數(shù)據(jù)的變化反映到最終的用戶界面。當用戶或外部的事件改變了數(shù)據(jù),如何操作這些數(shù)據(jù)流?

Principles of Data Flow - 數(shù)據(jù)流的原則

數(shù)據(jù)是所有驅(qū)動 UI 的信息。SwiftUI 為數(shù)據(jù)流提供了一系列工具:Property,@Environment,BindableObject,@State,@Binding。


SwiftUI 為數(shù)據(jù)流提供了一系列工具

開發(fā)者過去需要小心的把變化的數(shù)據(jù)同步到各種視圖和他們的子視圖,這通常會使得代碼變得復雜和易出 bug。SwiftUI 引入了 Single Source of truth,即單一信息源的原則。位于父視圖中的屬性,可以被子視圖訪問。


Single Source of truth


@State - 狀態(tài)

@State 就是 Source of truth。

在 View 的 struct 里聲明屬性時,使用 @State 關鍵字表示視圖中的 UI 元素會依賴該屬性的值動態(tài)改變。當屬性值變化時,SwiftUI 會使用新的值重新從 body 生成一個新的 View,達到數(shù)據(jù)改變映射到用戶界面的效果。

@State 是一個“Property Wrapper”,即屬性包裝。當一個屬性使用 @State 關鍵詞時,Swift 會為這個屬性添加一些額外的操作,比如 Bool 類型可以獲得 toggle() 方法,用于在 true/false 之間切換。

視圖經(jīng)常會被系統(tǒng)重建,所以需要給屬性賦一個默認的值。若屬性被標記為 @State,系統(tǒng)會使用儲存的變量的值,而不是每次都使用初始化的值。

同時,為了保證運行效率,系統(tǒng)會比較值改變導致哪些視圖需要被重新渲染,最后只重新渲染那些需要更新的視圖。

更新視圖

數(shù)據(jù)流向是單向的:用戶產(chǎn)生一個交互事件,導致視圖中某個 @State 的屬性發(fā)生變化,然后 SwiftUI 更新對應的 View,最后把渲染后的界面反饋給用戶。


數(shù)據(jù)流向是單向的


@Binding - 綁定

@Binding 為子視圖提供讀/寫 Source of truth 的方法

如果要將子視圖打包成一個新的自定義視圖,同時又依賴了父視圖的 @State 的屬性,那么這種情況不應該在子視圖里使用 @State 來標記屬性。因為使用 @State 會導致子視圖中的屬性成為新的 Source of truth。

子視圖的渲染依賴父視圖的屬性,所以它不應該有自己的 Source of truth。它只需要獲取父視圖的這個屬性,然后修改它。

這種情況,應該要在子視圖中使用 @Binding。

在子視圖中使用 @Binding

@Binding 標記的屬性不需要一個初始化的值,因為這個值會從父視圖的 @State 屬性自動生成。

在子視圖中使用 @Binding

只需要在父視圖中,聲明子視圖的時候傳入帶美元符號的屬性名即可完成綁定。父視圖依舊持有 @State 這個 Source of truth,同時子視圖可以通過綁定訪問父視圖的屬性。

通過這種優(yōu)雅的數(shù)據(jù)流控制方式,我們不再需要 ViewController 了!

響應外部事件并更新視圖

某些事件是從外部發(fā)生的,例如:計時器,通知。

響應外部事件

在視圖中添加類似于?.onRecive() 的?Modifier 可以監(jiān)聽外部事件。外部數(shù)據(jù)會傳入到閉包中,可以直接在閉包中通過 “self.屬性 = 新的值” 來修改視圖的 Source of truth 數(shù)據(jù),達到修改視圖的效果。

監(jiān)聽外部事件

BindableObject 與 @ObjectBinding

可以通過在定義 class 的時候?qū)崿F(xiàn) BindableObject 協(xié)議,使得對象能與 SwiftUI 中的視圖綁定。當 SwiftUI 中的 model 發(fā)生改變時,也會將改變反映在視圖中。

BindableObject

@ObjectBinding

@EnvironmentObject

@EnvironmentObject 是一個比較全局的對象。它可以跨視圖讓數(shù)據(jù)在所有視圖中正確地被渲染。使用 @EnvironmentObject 可以避免?@ObjectBinding 需要視圖層級之間傳遞數(shù)據(jù)的麻煩。

EnvironmentObject

EnvironmentObject


Data Flow Through SwiftUI - SwiftUI 中的數(shù)據(jù)流的評論 (共 條)

分享到微博請遵守國家法律
黄陵县| 鹤壁市| 高唐县| 云林县| 呼和浩特市| 盘锦市| 天长市| 万载县| 娱乐| 南投市| 清远市| 盐亭县| 法库县| 凤山县| 新干县| 巫溪县| 东明县| 日土县| 海口市| 福安市| 临清市| 白朗县| 张家港市| 建瓯市| 苍山县| 九龙县| 广昌县| 枣庄市| 抚州市| 水富县| 金溪县| 隆回县| 柏乡县| 汨罗市| 新化县| 阿拉尔市| 宁津县| 洛宁县| 织金县| 文安县| 永春县|