簡體   English   中英

在 SwiftUI MVVM 中的子視圖和父視圖之間共享值

[英]Share value between child and parent view in SwiftUI MVVM

我正在嘗試使用 SwiftUI 和 MVVM 架構編寫應用程序。 我了解當視圖 model 更改時視圖如何自動更新,但我不明白如何在父視圖中訪問該視圖 model。 例如,我有這個視圖,其中包含一個紅色背景的文本字段:

class CustomTextFieldViewModel: ObservableObject {
    @Published var text: String = "abc"
}

struct CustomTextField: View {
    @ObservedObject var viewModel: CustomTextFieldViewModel

    var body: some View {
        ZStack {
            Color.red
                .frame(height: 50)
            TextField("Enter text...", text: $viewModel.text)
        }
    }
}

然后,我的主要內容視圖包含此 CustomTextField 的實例以及應該引用文本字段文本的 Text:

class ContentViewModel: ObservableObject {
    @Published var textFieldModel = CustomTextFieldViewModel()
}

struct ContentView: View {
    @ObservedObject var viewModel = ContentViewModel()
    var body: some View {
        VStack {
            CustomTextField(viewModel: $viewModel.textFieldModel)
            TextField("type", text: $viewModel.textFieldModel.text)
        }
    }
}

當我第一次啟動應用程序時,文本 label 確實顯示了“abc”的初始值,但是當我在文本字段中輸入時,它不會更新。 我怎樣才能“同步”這兩者?

這是修復

struct ContentView: View {
    @ObservedObject var viewModel = ContentViewModel()
    var body: some View {
        VStack {
            CustomTextField(viewModel: viewModel.textFieldModel) // << fix !!
            Text("\(viewModel.textFieldModel.text)")
        }
    }
}

我最終通過這樣做來修復它:

class ContentViewModel: ObservableObject {
    @Published var textFieldModel = CustomTextFieldViewModel()
}

struct ContentView: View {
    @ObservedObject var viewModel = ContentViewModel()
    var body: some View {
        VStack {
            CustomTextField(viewModel: $viewModel.textFieldModel)
            Text("\($viewModel.textFieldModel.text.wrappedValue)") //<< wrappedValue
        }
    }
}

class CustomTextFieldViewModel: ObservableObject {
    @Published var text: String = "abc"
}

struct CustomTextField: View {
    @Binding var viewModel: CustomTextFieldViewModel //<< @Binding

    var body: some View {
        ZStack {
            Color.red
                .frame(height: 50)
            TextField("Enter text...", text: $viewModel.text)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM