簡體   English   中英

SwiftUI / 結合兩個模型之間的 Pass 數據

[英]SwiftUI / Combine Pass data between two models

我對如何在兩個模型之間傳遞數據有疑問。

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 state 從單元傳遞到主 model,然后在那里做出反應。 例如發送請求。

您需要在SettingsCell isOn聲明為@Binding

@State只能用於在View內部初始化的屬性,並且必須始終是private 如果您想傳入一個值,該值應在View更改時更新,但該值是在View外部創建的,則需要使用Binding

另一個需要注意的非常重要的事情是@ObservedObject必須始終注入到View中,您不能在視圖本身內初始化它們。 這是因為每當更新@ObservedObject時,它都會更新視圖本身,因此如果您在視圖內初始化 object,每當 object 更新視圖時,視圖將創建一個新的@ObservedObject ,因此您的更改不會被持久化從model來看。

如果您的目標是 iOS 14 並希望在視圖內創建 model,則可以改用@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)
        }
    }
}

在數據由父視圖“擁有”的情況下使用Binding - 即父視圖擁有事實來源 - 並且需要子視圖更新它:

struct SettingsCell: View {
    @Binding var isOn: Bool // change to Binding

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

struct SettingsView: View {
    // unrelated, but better to use StateObject
    @StateObject var model = SettingsModel() 

    var body: some View {
        List {
            // pass the binding by prefixing with $
            SettingsCell(isOn: $model.someValue)
        }
    }
}

暫無
暫無

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

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