我把我的应用程序的motionManager从ContentView传递到SecondView,它运行良好,但是我不知道如何在预览的SecondView中传递它,它需要参数类型Binding<CMMotionManager>
ContentView
import SwiftUI
import CoreMotion
struct ContentView: View {
@State private var motionManager = CMMotionManager()
let queue = OperationQueue()
@State private var roll = Double.zero
var body: some View {
NavigationView {
VStack {
Text("Roll is: \(roll)")
.font(.largeTitle)
NavigationLink {
SecondView(motionManager: $motionManager)
} label: {
Text("Change View")
}
}
.onAppear {
//Detect device motion
self.motionManager.startDeviceMotionUpdates(to: self.queue) { (data: CMDeviceMotion?, error: Error?) in
guard let data = data else {
print("Error: \(error!)")
return
}
let attitude: CMAttitude = data.attitude
DispatchQueue.main.async {
self.roll = attitude.roll
}
}
}
}
}
}SecondView
import SwiftUI
import CoreMotion
struct SecondView: View {
@Binding var motionManager: CMMotionManager
var body: some View {
Text("Hello, World!")
}
}
struct SecondView_Previews: PreviewProvider {
static var previews: some View {
SecondView(motionManager: Binding<CMMotionManager>) <-- //What should i pass here??
}
}发布于 2022-08-05 04:59:41
您不需要对CMMotionManager进行状态/绑定,因为它是引用类型的,正如您自己提到的,它将是单个对象。
所以,只需在常规属性中使用by-ref即可。
struct ContentView: View {
private var motionManager = CMMotionManager() // << here !!
//...
}
struct SecondView: View {
let motionManager: CMMotionManager // << here !!
var body: some View {
Text("Hello, World!")
}
}
struct SecondView_Previews: PreviewProvider {
static var previews: some View {
SecondView(motionManager: CMMotionManager()) // << here !!
}
}https://stackoverflow.com/questions/73243493
复制相似问题