我试图使用@EnvironmentObject将数据传递给我的SwiftUI视图:
struct MyView: View {
@EnvironmentObject var myInt: Int // ❌ Property type 'Int' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'
var body: some View {
EmptyView()
}
}func constructView() {
let myInt = 1
MyView()
.environmentObject(myInt)
}@EnvironmentObject一行有一个编译器错误(上面列出)。
如何将@EnvironmentObject与Int结合使用
Update:一个想法是,@EnvironmentObject只能用于符合ObservableObject的类,所以我尝试切换到现在编译的@Environment,但是产生了一个不同的错误:
struct MyView: View {
@Environment var myInt: Int
var body: some View {
EmptyView()
}
}func constructView() {
let myInt = 1
MyView() // ❌ Missing argument for parameter 'myInt' in call
.environment(\.myInt, myInt)
}现在,当我试图构造它时,它会抱怨没有设置myInt。
发布于 2019-12-16 08:47:41
如果要使用环境系统,则需要提供访问它的密钥。您不能使用未注册的密钥(这就是您的错误所在)。首先,创建一个EnvironmentKey
struct MyIntEnvironmentKey: EnvironmentKey {
static var defaultValue = 0
}接下来,创建一个设置/获取环境值的关键路径:
extension EnvironmentValues {
var myInt: Int {
get { self[MyIntEnvironmentKey.self] }
set { self[MyIntEnvironmentKey.self] = newValue }
}
}现在,您可以在父视图中设置它:
MyView().environment(\.myInt, myInt)最重要的是,您需要在视图中引用要引用的键:
struct MyView: View {
@Environment(\.myInt) private var myInt: Int
var body: some View {
Text("\(self.myInt)")
}
}发布于 2019-12-15 22:58:39
@EnvironmentObject只能与一起使用。Int实际上是一个struct。
如果您确实想在Int s之间共享该值,可以将该值包装在一个类中:
class SharedInt: ObservableObject {
@Published var myInt = 1
}而且,在SceneDelegate.swift中,它应该更像这样
let contentView = ContentView().environmentObject(SharedInt())
if let windowScene = /* ... */或者在SwiftUI生命周期的...App.swift中
WindowGroup {
ContentView()
.environmentObject(SharedInt())
}https://stackoverflow.com/questions/59348728
复制相似问题