首页 > 解决方案 > SwiftUI / 在两个模型之间组合传递数据

问题描述

我对如何在两个模型之间传递数据有疑问。

struct SettingsCell: View {
    @State var isOn: Bool

    var body: some View {
        Toggle(name, isOn: $isOn)
    }
}

class SettingsModel: ObservableObject {
    @Published var someValue: Bool = false
}

struct SettingsView: View {
    @ObservedObject var model = SettingsModel()

    var body: some View {
        List {
            SettingsCell(isOn: model.someValue)
        }
    }
}

所以我想将 isOn 状态从单元传递到主模型,并在那里做出反应。例如发送请求。

标签: iosswiftswiftuicombine

解决方案


您需要isOn@Binding.SettingsCell

@State只能用于在View自身内部初始化的属性,并且必须始终为private. 如果要传入一个值,该值应View在其更改时更新,但该值是在 之外创建的View,则需要使用Binding.

另一个需要注意的非常重要的事情是@ObservedObjects 必须始终注入到Views 中,您不能在视图本身内初始化它们。这是因为每当@ObservedObject更新 an 时,它都会更新视图本身,因此,如果您在视图中初始化对象,则每当对象更新视图时,视图都会创建一个新视图,@ObservedObject因此您的更改不会从视图持久化到该模型。

如果您的目标是 iOS 14 并想在视图中创建模型,则可以使用@StateObject

struct SettingsCell: View {
    @Binding private var isOn: Bool

    init(isOn: Binding<Bool>) {
        self._isOn = isOn
    }

    var body: some View {
        Toggle(name, isOn: $isOn)
    }
}

class SettingsModel: ObservableObject {
    @Published var someValue: Bool = false
}

struct SettingsView: View {
    @ObservedObject private var model: SettingsModel

    init(model: SettingsModel) {
        self.model = model
    }

    var body: some View {
        List {
            SettingsCell(isOn: $model.someValue)
        }
    }
}

推荐阅读