如何设置多个相同类型的 EnvironmentObjects [英] How to set multiple EnvironmentObjects which are same type

查看:55
本文介绍了如何设置多个相同类型的 EnvironmentObjects的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了这个问题 SwiftUI:将多个 BindableObjects 放入环境

答案说 environmentObject(ObservableObject) 返回修改后的视图,因此我可以为多个 environmentObject 创建调用链.

the answer said environmentObject(ObservableObject) returns modified view, therefore I can make call chain for multiple environmentObject.

喜欢

let rootView = ContentView()
     .environmentObject(firstBindable)
     .environmentObject(secondBindable)

我想知道如果 firstBindable 和 secondBindable 是相同类型的结果是什么..environmentObject() 如何知道程序员打算在 firstBindablesecondBindable 之间设置的 exec 值是什么.

and I wonder what is result if firstBindable and secondBindable are same type. how .environmentObject() knows what is exect value which is a programmer intended to set between firstBindable and secondBindable.

所以我测试了这个

  1. 我创建了一个 ObservableObject 类

final class TempStr: ObservableObject {
    @Published var tmpStr = "temp"

    init(initStr: String) {
        tmpStr = initStr
    }
}

  1. 从sceneDelegate调用environmentObject

window.rootViewController
  = UIHostingController(rootView:
      TestView()
        .environmentObject(TempStr(initStr: "1st")) 
        .environmentObject(TempStr(initStr: "2nd"))

  1. 和使用的视图值

struct TestView: View {
  @EnvironmentObject var tmp1: TempStr
  @EnvironmentObject var tmp2: TempStr

   var body: some View {
      Text(tmp1.tmpStr + " " + tmp2.tmpStr)
   }
}

  1. 结果是1st 1st"

如果我的代码调用一个 .environmentObject() 就像

And if my code calls one .environmentObject() like

TestView().environmentObject(TempStr(initStr: "1st")) 

TestView 中的 tmp1 和 tmp2 具有相同的值 TempStr(initStr: "1st").看起来 .environmentObject() 调用设置了相同类型的所有值.

both tmp1 and tmp2 from TestView have same value TempStr(initStr: "1st"). it looks like .environmentObject() call sets all values of same type.


实际上,我知道它不能工作,但我只是尝试使用这个问题.

Actually, I knew that it couldn't work but I just tried it for using this question.

我想知道实现目标的正确方法是什么.

I wonder what is correct way of achieving my goal.

谢谢

推荐答案

这有效:

场景委托:

class MyModel: ObservableObject {
    @Published var tmpStr1:TempStr!
    @Published var tmpStr2:TempStr!

    init(initStr1: String, initStr2:String) {
        tmpStr1 = TempStr(initStr: initStr1)
        tmpStr2 = TempStr(initStr: initStr2)
    }
}
class TempStr: ObservableObject {
    @Published var tmpStr:String!

    init(initStr: String) {
        tmpStr = initStr
    }
}

内容视图:

struct ContentView: View {
    @EnvironmentObject var myModel: MyModel
    var body: some View {
        Text(myModel.tmpStr1.tmpStr + " " + myModel.tmpStr2.tmpStr)
    }
}

当然,这可能不是你正在寻找的东西,但这引出了一个问题——为什么想要一个 class 的两个实例而不想要每个在你的模型中?您可以轻松地将两个 单独 类作为模型的 pat(以及 ObservableObjects),并且如果您想要每个 SceneDelegate 的模型的两个单独实例?就是这样.

Granted, this may not be what you are looking for, but that begs the question - why do want want two instances of a class without wanting each in your model? You can easily have two separate classes as pat of your model (and as ObservableObjects) and if you want two separate instances of your model per SceneDelegate? There it is.

但是如果你想要你的模型/类/任何东西的两个实例,感觉就像重构的候选对象.

But if you want two instances of your model/class/whatever, it feels like a candidate for refactoring.

这篇关于如何设置多个相同类型的 EnvironmentObjects的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆