Sen*_*ful 10 environment-variables swiftui
我正在尝试使用 @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()
}
}
Run Code Online (Sandbox Code Playgroud)
func constructView() {
let myInt = 1
MyView()
.environmentObject(myInt)
}
Run Code Online (Sandbox Code Playgroud)
带有@EnvironmentObject 的行有一个编译器错误(如上所列)。
如何使用@EnvironmentObject有Int?
更新:一个想法是@EnvironmentObject只能与符合 的类一起使用ObservableObject,所以我尝试切换到@Environment现在编译的部分,但产生了不同的错误:
struct MyView: View {
@Environment var myInt: Int
var body: some View {
EmptyView()
}
}
Run Code Online (Sandbox Code Playgroud)
func constructView() {
let myInt = 1
MyView() // ? Missing argument for parameter 'myInt' in call
.environment(\.myInt, myInt)
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试构建它时,它抱怨myInt未设置。
Geo*_*e_E 10
@EnvironmentObject可以只用一个使用class。Int实际上是一个struct.
如果您确实想尝试Int在Views之间共享它,您可以将值包装在一个类中:
class SharedInt: ObservableObject {
@Published var myInt = 1
}
Run Code Online (Sandbox Code Playgroud)
此外,它应该在里面看起来更像这样SceneDelegate.swift:
let contentView = ContentView().environmentObject(SharedInt())
if let windowScene = /* ... */
Run Code Online (Sandbox Code Playgroud)
或者在 SwiftUI 生命周期中...App.swift:
WindowGroup {
ContentView()
.environmentObject(SharedInt())
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用环境系统,你需要提供一个密钥来访问它。您不能使用未注册的密钥(这是您的错误所在)。首先,创建一个EnvironmentKey:
struct MyIntEnvironmentKey: EnvironmentKey {
static var defaultValue = 0
}
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个关键路径来设置/获取您的环境值:
extension EnvironmentValues {
var myInt: Int {
get { self[MyIntEnvironmentKey.self] }
set { self[MyIntEnvironmentKey.self] = newValue }
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以在父视图中设置它:
MyView().environment(\.myInt, myInt)
Run Code Online (Sandbox Code Playgroud)
至关重要的是,您需要在要引用它的视图中引用键:
struct MyView: View {
@Environment(\.myInt) private var myInt: Int
var body: some View {
Text("\(self.myInt)")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8835 次 |
| 最近记录: |