为什么swiftui不能区分2个不同的环境对象?

时间:2020-05-14 18:14:40

标签: swiftui

我有这段代码,希望b为Text。

结果:a->参见屏幕截图。我在做什么错了?

import SwiftUI

class PublishString : ObservableObject {

    init(string: String) {
        self.string = string
        print(self.string)
    }

    @Published var string : String = "a"
}

struct ContentView: View {

    @EnvironmentObject var text1 : PublishString
    @EnvironmentObject var text2 : PublishString

    var body: some View {
        VStack {
            Text(text1.string)
            Text(text2.string)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(PublishString(string: "a"))
        .environmentObject(PublishString(string: "b"))
    }
}

enter image description here

并且...有效:

class PublishString : ObservableObject {

    init(string: String) {
        self.string = string
        print(self.string)
    }

    @Published var string : String = "a"
}

class PublishString2 : ObservableObject {

    init(string: String) {
        self.string = string
        print(self.string)
    }

    @Published var string : String = "a"
}

struct ContentView: View {

    @EnvironmentObject var text1 : PublishString
    @EnvironmentObject var text2 : PublishString2

    var body: some View {
        VStack {
            Text(text1.string)
            Text(text2.string)
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如注释中的Asperi所述,SwiftUI通过类型(您使用的类定义)来标识环境对象。它会寻找该类型的对象,并使用找到的第一个对象。

一种选择是在一个可以访问的对象上具有多个属性(在您的情况下,这意味着两个单独的String属性。

Apple documentation上提供了更多信息。

答案 1 :(得分:0)

接受的答案非常好且正确并回答了问题。

以下是一个简单的解决方法,如果您必须使用两个相同类型的 EnvironmentObjects 在您的应用程序中传递,并且偶然发现这个问题:

您可以创建一个继承第一个类的所有内容的第二个类。因此,您可以避免冗余并且可以单独使用两个 EnvironmentObject。

class PublishString : ObservableObject {

    init(string: String) {
        self.string = string
        print(self.string)
    }

    @Published var string : String = "a"
}

class PublishString2 : PublishString {}

struct ContentView: View {

    @EnvironmentObject var text1 : PublishString
    @EnvironmentObject var text2 : PublishString2

    var body: some View {
        VStack {
            Text(text1.string)
            Text(text2.string)
        }
    }
}

实例化:

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(PublishString(string: "a"))
        .environmentObject(PublishString2(string: "b"))
    }
}