我有这段代码,希望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"))
}
}
并且...有效:
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)
}
}
}
答案 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"))
}
}