gpt4 book ai didi

ios - 从 View 外部设置 SwiftUI @EnvironmentObject

转载 作者:行者123 更新时间:2023-12-01 15:42:47 24 4
gpt4 key购买 nike

我想让工作任务更新 SwiftUI View 。

工作任务正忙于执行应用程序的程序性工作 - 播放声音和触发基于计时器的事件。我想在这些计时器事件期间在 SwiftUI View 中闪烁几个图标。所以我想在这些图标 View 中触发 View 刷新。

因此,我创建了一个名为 Settings 的环境对象。它在 App Delegate 中实例化,并附加到 SceneDelegate 中的 Root View 。

设置对象在 SwiftUI View 层次结构中工作得很好。

问题是可怕的:

Fatal error: No ObservableObject of type Settings found. A View.environmentObject(_:) for Settings may be missing as an ancestor of this view.

我认为问题是工作类是在 AppDelegate 中实例化的,而 Settings 在实例化时还不是 ObservableObject。但是我很困惑。

环境对象很简单:

import SwiftUI
import Combine

final class Settings: ObservableObject {
@Published var showMenu: Bool = true
@Published var lessonNum: Int = 0

@Published var arrowsOn: Bool = false {
willSet {
willChange.send(self)
}
}
}

let willChange = PassthroughSubject<Settings, Never>()

它与 worker 类一起在 AppDelegate 中实例化:

let settings = Settings()
...
var workerClass = WorkerClass()
var leftArrow = LeftArrowView()

然后传递给 SceneDelegate:

            window.rootViewController = UIHostingController(rootView: contentView
.environmentObject(settings)

使用设置的 subview 查看环境对象以在打开或关闭状态下绘制图标:

import SwiftUI

struct LeftArrowView: View {
@EnvironmentObject var settings: Settings

let leftArrowOnImage = Image("Arrow Left On").renderingMode(.original)
let leftArrowOffImage = Image("Arrow Left Off").renderingMode(.original)

var body: some View {
ZStack {
if settings.arrowsOn {
leftArrowOnImage
} else {
leftArrowOffImage
}
}
}
}

worker 类在 SwiftUI View 层次结构中作为 Button 操作从更高层调用。

在工作类中,我尝试附加到设置环境对象:

import Combine

public class WorkerClass : NSObject, ObservableObject {

@EnvironmentObject var settings: Settings

在通过计时器调用的方法中,我尝试更新环境对象中的变量:

       settings.arrowsOn = !settings.arrowsOn
print("Arrows are \(settings.arrowsOn)")

...这是当我发现我实际上未能正确附加到环境对象时。

我错过了什么?

提前感谢您的任何见解...

最佳答案

@EnvironmentObject 包装器只能在 SwiftUI View 中使用,在其他地方你可以正常使用引用类型,所以这里是可能的解决方案

public class WorkerClass : NSObject, ObservableObject {
var settings: Settings // reference property

以及何时创建

let settings = Settings()
...
var workerClass = WorkerClass(settings: settings) // << same settings as in view

关于ios - 从 View 外部设置 SwiftUI @EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62268309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com