複数ビューの重複データの管理[SwitUI]


背景
親ビューで編集ボタンを押してサブビューに移動するとします.サブビューには、親ビューの背景色を変更する機能が含まれます.では、サブビューで変更した背景色を親ビューに渡して、親ビューの背景色を変更するにはどうすればいいのでしょうか.
に道を教える
まず,単点源(SSOT)の概念を理解する.たとえば、あるデータが親ビューで使用され、サブビューで使用されるとします.SSOTの概念を理解していない場合は、親ビューに特定のデータを格納し、サブビューに特定のデータを格納します.これは、データが複数の場所に格納されているためにエラーが発生します.ただし、親ビューにSOTというリポジトリを作成する場合は、親ビューからアクセスするか、子ビューからアクセスすることができます.さらに、サブビューでSOTの値を変更すると、親ビューはそれに気づき、ビューを更新します.
上のリンクを参照してください.まず、@Stateという名前のPropertyを使用して、そのPropertyを宣言するビューにSOTを作成します.以下のように宣言することができる.
@State private var name = "Amy" // "Amy"라는 이름을 SOT에 저장
親ビューが画面に名前を表示するとします.もしそうなら、このような方法でコードを整理することができます.
struct MeetingView: View {
		@State private var name = "Amy"
    var body: some View {
				Text($name)
		}
}
nameの前に$を追加するのは、値がバインドされている場合にのみ、nameが変更されたときにビューが検出され更新されるためです.
したがって、サブビューを呼び出すときも、SOTにアクセスするには$を貼り付け、バインドされた値を渡す必要があります.
struct DetailView: View {
		... // 생략
		@State private var name = "Amy"
    var body: some View {
				Text($name)
		}

    var body: some View {
        List{
            ... // 생략
        }
        .sheet(isPresented: isPresentingEditView){
            NavigationView {
                DetailEditView(data: $data) // 자식 뷰를 호출할 때도 $를 붙여준다.
今からビューを見てみましょう.
struct DetailEditView: View {
    @Binding var name: String
    
    var body: some View {
        TextField("Name", text: $name)
				... // 생략
    }
}
名前をTextFieldに変更できます.変更後に親ビューに移動すると、親ビューも変更された名前に変更されていることがわかります.これは、SOTに保存されている値に触れるため、$付きの値はすべて値変更時にupdateとして確認できます.