【问题标题】:Using @EnvironmentObject properties with CADisplayLink将 @EnvironmentObject 属性与 CADisplayLink 一起使用
【发布时间】:2020-09-25 17:38:19
【问题描述】:

我正在尝试为某些动画实现CADisplayLink,但是当我尝试从类MyAnimations 中访问我的MainData 环境对象属性时,我收到了致命错误No ObservableObject of type MainData found. A View.environmentObject(_:) for MainData may be missing as an ancestor of this view.

在 SceneDelegate 中,我将 MainData 设置为 ContentView 上的环境对象:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    var mainData = MainData()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            
            window.rootViewController = UIHostingController(rootView: contentView.environmentObject(self.mainData))
            
            self.window = window
            window.makeKeyAndVisible()
        }
    }

...

}

这是CADisplayLink 的课程。 createDisplayLink() 是从 ContentView 调用的:

class MyAnimations: NSObject{
    @EnvironmentObject var mainData: MainData

    
    func createDisplayLink() {
        let displaylink = CADisplayLink(target: self, selector: #selector(step))
        
        displaylink.add(to: .current, forMode: RunLoop.Mode.default)
    }
    

    @objc func step(link: CADisplayLink) {
        mainData.displayLinkY += 1.5   //Error here
        mainData.displayLinkX += 1.5
    }
    
    
} 

我的问题是:如何从step() 内部更改环境对象属性displayLinkXdisplayLinkY

【问题讨论】:

    标签: swift swiftui cadisplaylink


    【解决方案1】:

    只需删除 @EnvironmentObject 属性包装器,它仅适用于 SwiftUI

    class MyAnimations: NSObject{
        var mainData: MainData
    
        init(mainData: MainData) {
          self.mainData = mainData
            super.init()
        }
    
        // ... other code
    }
    

    【讨论】:

    • Xcode 希望我添加一个初始化程序,但是当我添加 override init() {... 时,我收到错误 Property 'self.mainData' not initialized at implicitly generated super.init call。我将 mainData 初始化为什么?你知道我的意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2014-10-30
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多