ios - @EnvironmentObject 可以与不是视图的普通结构一起使用吗?
问题描述
我在将类信息从一个结构实例传递到另一个结构实例时遇到了麻烦,所以我一直在搞砸尝试。
这有效,因为我正在通过 Views
// phone_testingApp.swift
import SwiftUI
@main
struct phone_testingApp: App {
@ObservedObject var myObservedObject = MyObservedObject()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(myObservedObject)
}
}
}
// ContentView.swift
import SwiftUI
import Combine
struct ContentView: View {
var subtract = MinusToObject()
@EnvironmentObject var myNumber: MyObservedObject
var body: some View {
VStack{
Text("The number is \(myNumber.theObservedObjectToPass)")
MinusToObject()
.environmentObject(myNumber)
}
}
}
class MyObservedObject: ObservableObject {
@Published var theObservedObjectToPass = 5
}
struct MinusToObject: View {
@EnvironmentObject var theObservedObject: MyObservedObject
var body: some View {
Text("Minus")
.onTapGesture {
theObservedObject.theObservedObjectToPass -= 1
}
}
}
但是如果我只使用一个不符合 View 这样的普通结构尝试类似的东西
import SwiftUI
import Combine
struct ContentView: View {
var subtract = MinusToObject()
@EnvironmentObject var myNumber: MyObservedObject
var body: some View {
VStack{
Text("The number is \(myNumber.theObservedObjectToPass)")
Text("Minus")
.onTapGesture {
subtract.subtractIt()
}
}
}
}
class MyObservedObject: ObservableObject {
@Published var theObservedObjectToPass = 5
}
struct MinusToObject {
@EnvironmentObject var theObservedObject: MyObservedObject
func subtractIt() {
theObservedObject.theObservedObjectToPass -= 1 //Thread 1: Fatal error: No ObservableObject of type MyObservedObject found. A View.environmentObject(_:) for MyObservedObject may be missing as an ancestor of this view.
}
}
我收到一个运行时错误,这是我在调用函数时添加的注释。
我对如何传递引用类型的实例感到很困惑,所以我确信我做错了很多事情,任何帮助将不胜感激。
解决方案
这是行不通的,因为EnvironmentObject
注入是在 SwiftUIView
层次结构上仅对所有基于视图的子对象执行的。
如果您希望任何旧对象访问共享实例,则必须手动创建一个单例并将其注入 SwiftUI 视图层次结构。
class MyObservedObject: ObservableObject {
static let shared = MyObservedObject()
private init() { }
@Published var theObservedObjectToPass = 5
}
/// you can use it in a plain object
struct MinusToObject {
func subtractIt() {
MyObservedObject.shared.theObservedObjectToPass -= 1
}
}
// you can use it in a view
struct ContentView: View {
var body: some View {
SomeOtherView()
.environmentObject(MyObservedObject.shared)
}
}
推荐阅读
- javascript - 轴 #0 的数据列不能是带有谷歌图表的字符串类型
- perl - 如何在不破坏页面其余部分的情况下将包含表情符号的推文添加到我的页面?
- python - 将多个字典转换为 csv 表的最快方法
- python - “WHERE”附近的Django sqlite3 OperationalError:语法错误
- iterm2 - iTerm2 Python API 拆分选项卡
- javascript - 无法使用 flowrouter 在反应模板中安装反应组件
- python - 将数字输出标签转换为 keras 中的分类向量
- python - 为什么 str.replace python 方法会失败?
- java - JNA如何将String []从Java传递到C代码
- firebase - Golang 中的 Firestore gRPC API 示例用法