SwiftUI狀態(tài)管理--Combine(Environment话浇、EnvironmentObject)


SwiftUI 已經(jīng)如同前端vue脏毯、react 一般支持響應(yīng)式編程。也有類似前端的 state幔崖。如今swiftUI已經(jīng)到2.0版本食店。swift 也已經(jīng)5.5了 。所以現(xiàn)階段從OC 切換到swift是一個非常合適的時機(有點晚)赏寇。了解swift 或者前端就會明白OC的笨重吉嫩。作為一個已經(jīng)使用了8年OC的開發(fā)來說,切換到swift無疑有著不舍嗅定。不過學(xué)習(xí)新的東西自娩,總是充滿了挑戰(zhàn)。

通過最近的學(xué)習(xí)和使用特此整理渠退。本文以實際使用出發(fā)忙迁。具體實現(xiàn)原理待后面研究源碼再進行整理。
在實際項目中使用到的有:

  • AppStorage
  • Environment
  • EnvironmentObject
  • ObservedObject
  • StateObject

Environment

值類型智什,當(dāng)創(chuàng)建應(yīng)用時动漾,會自動創(chuàng)建Environment。其主要作用是傳遞系統(tǒng)的一些設(shè)置荠锭。如ColorScheme旱眯、NSManagedObjectContext。系統(tǒng)又很多對應(yīng)的key可以查看EnvironmentValues獲取key列表。
在需要使用的view中删豺,只需要使用PropertyWrapper屬性包裝器 @Enviroment

import SwiftUI

struct HomePageView: View {
    // colorScheme values: .light, .dark
    @Enviroment(\.colorScheme) var colorScheme
    
    var body: some View {
        Text("Hello, World")
            .foregroundColor(colorScheme = .light ? .yellow : .blue)
    }
}

雖然系統(tǒng)自動創(chuàng)建共虑,不過我們也可以自定義一個EnviromentKey,代碼如下:

import Foundation
import SwiftUI

struct UserInfo {
    var userName: String = ""
    init(userName: String) {
        self.userName = userName
    }
}

struct UserInfoKey: EnvironmentKey {
    static var defaultValue: UserInfo {
        return UserInfo(userName: "lixxx")
    }
}

extension EnvironmentValues {
    var userInfo: UserInfo {
        get { return self[UserInfoKey.self] }
        set { self[UserInfoKey] = newValue }
    }
}

在使用自定義的Environment時,要手動去注入到根視圖上呀页。并初始化注入對象為其設(shè)置一個值妈拌。

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        TabbarPageView()
            .environment(\.userInfo, UserInfo(userName: "liqingyu"))
  
    }
}

EnvironmentObject

引用類型,和Environment作用相同蓬蝶,可操作性強尘分,可以使用其為應(yīng)用進行設(shè)置全局變量。共享數(shù)據(jù)于應(yīng)用各個頁面丸氛。
首先創(chuàng)建一個全局對象培愁。因為我們要使用這個對象,并且可能會進行修改缓窜,修改后可能會刷新界面等操作定续。所以我們要觀察這個對象 所以使用ObservableObject 協(xié)議 通過@Published 當(dāng)值發(fā)生變化時通知全局作出響應(yīng)。

import Foundation

class Person:ObservableObject {
    @Published var name = ""
}

在根視圖上進行注入禾锤,子視圖將可以進行響應(yīng)

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        TabbarPageView()
            .environmentObject(Person())  
    }
}

在需要使用的試圖進行引入操作

import SwiftUI

struct EnvironmentPageView: View {
    @EnvironmentObject var person: Person
    var body: some View {
        VStack{
            Text("name: \(person.name)")
        }
    }
}

編輯操作,Binding值綁定 及 = 屬性設(shè)置都是可以的

import SwiftUI

struct EnvironmentDetailView: View {
    @EnvironmentObject var person: Person
    var body: some View {
        TextField("Person", text: $person.name)
            .padding(20)
        .navigationBarTitleDisplayMode(.inline)
         .onAppear(){
                person.name = "liqngyu"
            }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載私股,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末恩掷,一起剝皮案震驚了整個濱河市倡鲸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螃成,老刑警劉巖旦签,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寸宏,居然都是意外死亡,警方通過查閱死者的電腦和手機偿曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門氮凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人望忆,你說我怎么就攤上這事罩阵。” “怎么了启摄?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵稿壁,是天一觀的道長。 經(jīng)常有香客問我歉备,道長傅是,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喧笔,結(jié)果婚禮上帽驯,老公的妹妹穿的比我還像新娘。我一直安慰自己书闸,他們只是感情好尼变,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浆劲,像睡著了一般嫌术。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牌借,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天蛉威,我揣著相機與錄音,去河邊找鬼走哺。 笑死蚯嫌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丙躏。 我是一名探鬼主播择示,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晒旅!你這毒婦竟也來了栅盲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤废恋,失蹤者是張志新(化名)和其女友劉穎谈秫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鱼鼓,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拟烫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迄本。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硕淑。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘉赎,靈堂內(nèi)的尸體忽然破棺而出置媳,到底是詐尸還是另有隱情,我是刑警寧澤公条,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布拇囊,位于F島的核電站,受9級特大地震影響靶橱,放射性物質(zhì)發(fā)生泄漏寥袭。R本人自食惡果不足惜路捧,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纠永。 院中可真熱鬧鬓长,春花似錦、人聲如沸尝江。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炭序。三九已至啤覆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惭聂,已是汗流浹背窗声。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辜纲,地道東北人笨觅。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像耕腾,于是被迫代替她去往敵國和親见剩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一 @State 加了@State注解的變量扫俺,視圖通過監(jiān)視和讀取該變量來重新渲染UI苍苞。 二 @Published ...
    sunny_ke_ke閱讀 2,305評論 0 10
  • 學(xué)習(xí)文章 文集:Hacking with iOS: SwiftUI Edition[https://www.jia...
    xmb閱讀 4,463評論 3 14
  • 最近抽空終于把官方SwiftUI Tutorials擼了一遍,網(wǎng)上已經(jīng)很多翻譯或者該Tutorials說明狼纬。 這...
    JerrySi閱讀 1,531評論 0 0
  • NavigationView是SwiftUI應(yīng)用的一個重要組件羹呵,它允許我們輕松地push和pop屏幕,以清晰疗琉、分層...
    豬豬行天下閱讀 11,542評論 1 9
  • SwiftUI要求 iOS13.0+ 快捷鍵 control + option + 點擊:出現(xiàn)屬性編輯器 comm...
    余青松閱讀 6,224評論 1 11