使用状態、観測可能オブジェクト、環境オブジェクト


☕️ SwiftUI

  • データ主導型アプリケーション開発
  • ユーザインタフェースのビューは、基本データ変更の処理コードを記述することなく、ビュー
  • を更新することができる.
  • データとユーザインタフェース内のビューとの間に、
  • のパブリッシャ(パブリッシャ)とサブスクライバ(サブスクライバ)が確立される.
    このため、SWIFTUIは、状態プロパティ、観測可能オブジェクト、および環境オブジェクトを提供する.
  • は、ユーザインタフェースの外観および動作を決定する状態
  • を提供する.

    🍶 ステータスの提供

  • 状態の最も基本的な形式
  • ビューレイアウトの現在の状態を保存
    -ボタンがアクティブかどうか、テキストフィールドに入力されたテキストなどを切り替えます.
  • StringやInt値などの単純なデータ型
  • を格納
  • @State Property Rapper声明
  • ステータス値はこのビューに属し、priavteとして宣言する必要があります.
  • 「宣言したステータスproperty値は変更されましたか?」->Propertyを宣言したビュー階層を再レンダリングする必要があります.
  • すなわち、Propertyに依存するすべてのビューは、最新値
  • を反映するために任意の方法で更新する必要がある.
  • ステータスpropertyが宣言されている場合は、関連するレイアウトのビューにバインドできます.
  • バインドビュー
  • で、変更が発生した場合、ステータスpropertyに自動的に反映されます.
  • ステータス属性とのバインドは、property名の前に「$」を付けることができます.
  • struct Test04: View {
        
        @State private var wifiEnabled = true
        @State private var userName = ""
        
        var body: some View {
            VStack{
                Toggle(isOn: $wifiEnabled, label: {
                    Text("Enable Wi-Fi")
                })
                Image(systemName: wifiEnabled ? "wifi":"wifi.slash").resizable().frame(width: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, height: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/).foregroundColor(.red)
                TextField("Enter user name",text:$userName)
                Text(userName).font(.largeTitle)
            }
        }
    }

    🍹 SystemNameイメージリファレンス:SF Symbol図面の内蔵ライブラリにアクセスできます.SF Symbolは、アップルプラットフォームアプリケーションの開発に使用できるベクトル画像のセットです.

    🤿 バインドステータス

  • 状態Propertyは、宣言ビューおよびそのサブビューの現在値
  • である.
  • But、一部のビューは1つ以上のサブビューを有し、同じ状態のPropertyに近づくと
  • が発生する.
  • @Binding Property Rapper外部ビューからステータスPropertyにアクセス可能
  • サブビューを呼び出す場合は、ステータスpropertyのバインドを渡すだけです.
    // 상태 바인딩
    struct Test05: View {
        @State private var wifiEnable = true
        var body: some View {
            VStack{
                Toggle(isOn: $wifiEnable, label: {
                    Text("wifi")
                })
                
                //이미지 뷰어를 외부로 정의
                //파라미터로 상태 속성을 보내준다
                WifiImageView(wifiEnable:$wifiEnable)
            }
        }
    }
    
    //이미지 뷰를 외부로 따로 선언
    struct WifiImageView:View{
        //상태 바인딩
        @Binding var wifiEnable : Bool
        var body: some View{
            Image(systemName: wifiEnable ? "wifi" : "wifi.slash")
        }
    }

    🎯 観測対象

  • 状態は、ビュー状態を保存する方法を提供し、このビューでのみ
  • を使用することができる.
  • サブビューまたは非実装状態バインドの他のビューは、
  • にアクセスできない.
  • 状態propertyは一時的であり、親ビューが消失するとその状態も
  • 消失する.
  • 観測対象は、
  • を使用して、複数の異なるビューが外部からアクセスできる永続的なデータを表す.
  • は、時間とともに変化する1つまたは複数のデータ値
  • を収集および管理する役割を果たす.
  • は、タイマまたは通知などのイベント
  • を処理するために使用することができる.
  • パブリッシュされたProperty(パブリッシュされたプロパティ)パブリッシュされたデータ値
  • サブスクリプション(サブスクリプション)
  • パブリッシャーは、パブリッシュされた製品が変更されるたびに
  • を更新します.
  • Combineフレームワーク:複数のパブリッシャーから1つのストリームにマージし、パブリッシングされたデータをサブスクライバのニーズを満たす様々なタスクに変換するためのカスタムパブリッシャー構築プラットフォームを提供します.
  • @Publish Property Rapper,
  • // 간단한 observable 객체 선언
    import Foundation
    import Combine //Combime 프레임워크 import
    
    class DemoData : ObservableObject{
        
        @Published var userCount = 0
        @Published var currentUser = ""
        
        init(){
            //데이터를 초기화하는 코드가 여기에 온다
            updateDate()
        }
        
        func updateDate(){
            // 데이터를 최신 상태로 유기하기 위한 코드가 여기에 온다
        }
    }
  • 購読者@ObservedObject Property Rapperを使用して上記構造体等の観察対象を購読(アクセス)する
  • を購読した場合、ビューとそのすべてのサブビューは、ステータスプロパティなどのパブリッシュされたPropertyにアクセスできます.
    struct Test06_Observable: View {
        //키워드 헷갈리지 않게 주의!!
        @ObservedObject var demoData : DemoData
        
        var body: some View {
            Text("\(demoData.currentUser),you are user number \(demoData.userCount)")
        }
    }
    
    struct Test06_Observable_Previews: PreviewProvider {
        static var previews: some View {
            Test06_Observable(demoData: DemoData())
        }
    }

    🎹 環境オブジェクト

  • オブジェクトは、特定のステータスでアプリケーション内のいくつかのSWIFTUIビューに使用する必要がある場合に、
  • に最適です.
  • あるビューから別のビューに移動し、移動するビューが同じサブスクリプションオブジェクトにアクセスする必要がある場合、移動時にサブスクリプションオブジェクトの参照をターゲットビュー
  • に渡す必要があります.
  • アプリケーション内の複数のビューは、同じサブスクリプションオブジェクトにアクセスすると複雑になる
  • .
  • この場合の環境オブジェクトの使用はより合理的です
  • 環境オブジェクトは、観測可能オブジェクトと同様に
  • を宣言する.
  • 重要な違いは、オブジェクトがSWIFTUI環境に格納され、ビューからビューに渡す必要がなく、すべてのビューが
  • にアクセスできることである.
  • @Environmentオブジェクトを購読する必要があるオブジェクトは、@ObservedObject Rapperではなく@EnvironmentObject Property Rapperを使用して参照できます.
  • Environmentオブジェクトは傍観者で初期化できないため、アクセスしたビュー設定画面で構成する必要があります.
  • SceneDelegate,
  • プロジェクト.swiftファイルのwillConnectToメソッドを変更する必要があります.
  • let contentView = ContentView()
    //DemoData 객체의 인스턴트를 저장
    let demoData = DemoData()
    
    if let windowScene = scene as? UIWindowScene{
    	let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: contentView.environmentObject(demoData))
        self.window = window'
        window.makeKeyAndVisible()
    }
    
    //미리보기 뷰에서 environment 객체를 사용하려면 프리뷰 선언뷰를 수정해야한다
    struct content_Previews: PreviewProvider{
    	static var previews: some View{
        	ContentView().environmentObject(DemoData())
        }
    }
    

    🎖 整理する


    ステータス構成

    사용자 인터페이스 레이아웃 내의 뷰 상태를 저장
    현재 콘텐트 뷰에 관한 것
    값은 임시적이어서 해당 뷰가 사라지면 값도 없어진다

    観測対象配置

    사용자 인터페이스 밖에 있으며 앱 내의 SwiftUI 뷰 구조체의 하위 뷰에만 필요한 데이터에서 사용
    데이터를 표시하는 클래스나 구조체는 ObservableObject 프로토콜을 따라야함
    뷰와 바인딩될 프로퍼티는 @Published 프로퍼티 래퍼를 사용하여 선언
    뷰 선언부에 Observable 객체 프로퍼티와 바인딩하려면 프로퍼티는 @ObseredObject 프로퍼티 래퍼를 사용

    環境オブジェクトの構成

    사용자 인터페이스 밖에 있으며 여러 뷰가 접근 해야하는 데이터에 사용
    Observable 객체와 동일한 방법으로 선언
    @EnvironmentObject 프로퍼티 래퍼를 사용하여 SwiftUI 뷰 파일 내에 선언
    SceneDelegate.swift 파일의 코드를 통해 뷰 화면이 앱에 추가될 때 Enivronment 객체 또한 초기화해야 함