Motion Manager is not working in Swift

冷暖自知 提交于 2019-11-28 07:19:14

问题


I am try to use motion manager in Swift but the log inside my update block never prints.

    var motionManager: CMMotionManager = CMMotionManager()
    motionManager.accelerometerUpdateInterval = 0.01
    println(motionManager.deviceMotionAvailable) // print true
    println(motionManager.deviceMotionActive) // print false
    motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
        deviceManager, error in
        println("Test") // no print
    })

    println(motionManager.deviceMotionActive) // print false     

My Objective-C implementation works fine. Does anyone know why my update block isn't being called?


回答1:


That's because the motion manager instance is being thrown out when the method returns. You should make a property on your class to contain the motion manager. Additionally, it looks like you were only changing the manger's accelerometerUpdateInterval and then monitoring device motion changes. You should set the deviceMotionUpdateInterval property instead.

import CoreMotion

class ViewController: UIViewController {
    let motionManager = CMMotionManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        motionManager.deviceMotionUpdateInterval = 0.01
        motionManager.startDeviceMotionUpdates(to: OperationQueue.current!) { deviceManager, error in
            print("Test") // no print
        }

        print(motionManager.isDeviceMotionActive) // print false
    }
}



回答2:


I thought that all obj-c variables are optionals in swift (since they can be nil) so NSOperationQueue should take a bang thusly:

MotionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue!.currentQueue(),withHandler:{deviceManager,error in println("test")})

Apple documentation here :

https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/#//apple_ref/swift/tdef/CMDeviceMotionHandler

States

The type of block callback for handling device-motion data.

Declaration SWIFT typealias CMDeviceMotionHandler = (CMDeviceMotion!, NSError!) -> Void



来源:https://stackoverflow.com/questions/24114164/motion-manager-is-not-working-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!