我在将类信息从一个结构实例传递到另一个结构实例时遇到了麻烦,所以我一直在搞麻烦。
这行得通,因为我正在通过视图

// 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注入仅对所有基于视图的子级对象的SwiftUI View层次结构执行。
如果您希望任何旧对象访问共享实例,则必须手动创建一个单例并将其注入到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)
    }
}

10-06 13:32
查看更多