Macos 向SwitUI环境添加HID输入状态

Macos 向SwitUI环境添加HID输入状态,macos,swiftui,Macos,Swiftui,我有一个超级基本的Swift类MultiAxisDevice,它包装了HID管理器并处理来自6自由度空间鼠标的输入。我想将其添加到我的macOS应用程序范围的环境中,以便任何视图都可以获得设备状态的更新。但我不确定在哪里实例化它并设置它,以及如何在一些任意视图中获得它 这是包装纸: 类 多轴设备:可观察对象 { init() { self.hidManager=hidManager.shared self.hidManager.delegate=self } 让hidManager:hidMan

我有一个超级基本的Swift类
MultiAxisDevice
,它包装了HID管理器并处理来自6自由度空间鼠标的输入。我想将其添加到我的macOS应用程序范围的环境中,以便任何视图都可以获得设备状态的更新。但我不确定在哪里实例化它并设置它,以及如何在一些任意视图中获得它

这是包装纸:

类
多轴设备:可观察对象
{
init()
{
self.hidManager=hidManager.shared
self.hidManager.delegate=self
}
让hidManager:hidManager
@已发布的变量状态=多轴状态()
}
延伸
多轴设备:HIDManagerDelegate
{
func
deviceValueReceived(设备索引:HIDDevice,元素inElement:IOHIDElement,cookie inCookie:IOHIDElementCookie,代码inCode:Int)
{
//空间鼠标cookie 54是滚动轴
var state=self.state
开关(inCookie)
{
案例54:state.roll=inCode
违约:
打破
}
self.state=状态
}
}
结构
多轴状态
{
变量滚动:Int=0
}

如何使我的SwiftUI视图依赖于
多轴状态

我认为SwiftUI 2.0中惯用的方法是将模型实例化为应用程序视图层次结构顶部的
@StateObject
,然后将其添加到环境中供后代视图使用,例如

struct someParent: View {
    @StateObject private var model = MyTypeFoo()

    var body: some View {
            anotherView().environmentObject(model)
    }
}
然后,可以在父对象的任何直接子视图中作为
@EnvironmentObject
访问该模型,如下所示

struct someDescendantOfAnotherView: View {
    @EnvironmentObject private var model: MyTypeFoo 

    var body: some View {
       ... do something with model
    }
}

嗯,所以我认为这是一个正常的SwiftUI更新过程不起作用的情况。我有一个场景视图,我只想更新SCNScene的相机位置/姿态。在这种情况下,您不希望重建视图。所以我真的需要类似于
.onReceive()
闭包的东西。哦,我找到了!我的onReceive通话中缺少
$
。它应该是
.onReceive(self.multiAxisInput.state)
。一旦我解决了这个问题,你的帮助就解决了问题。现在,如果我能确定我的视图的任何给定实例是否应该用这个来操纵(即最前面的窗口?)。嗯,可能遗漏了一些东西-但是如果没有更直接的东西出现,而谷歌搜索时,前面的窗口不是总是最后一个有焦点的窗口吗?如果这听起来很有希望,那么Swiftui实验室在这里有一篇关于它的小文章——祝你好运。