2014-06-09 9 views
9

Ich versuche, Bewegungsmanager in Swift zu verwenden, aber das Protokoll in meinem Update-Block wird nie gedruckt.Motion Manager funktioniert nicht in Swift

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  

Meine Objective-C-Implementierung funktioniert gut. Weiß jemand, warum mein Update-Block nicht aufgerufen wird?

Antwort

22

Das liegt daran, dass die Motion Manager-Instanz beim Zurückkehren der Methode verworfen wird. Sie sollten eine Eigenschaft in Ihrer Klasse erstellen, die den Bewegungsmanager enthält. Außerdem sieht es so aus, als ob Sie nur die accelerometerUpdateInterval des Managers ändern und dann die Bewegungsänderungen des Geräts überwachen. Sie sollten stattdessen die deviceMotionUpdateInterval-Eigenschaft festlegen.

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 
    } 
} 
0

Ich dachte, dass alle obj-c-Variablen sind optionals in swift (da sie gleich Null sein) so NSOperationQueue thusly einen Knall nehmen sollte:

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

Apple-Dokumentation hier:

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

Zustände

Der Typ o f Bausteinrückruf zum Handhaben von Gerätebewegungsdaten.

Erklärung SWIFT typealias CMDeviceMotionHandler = (CMDeviceMotion !, NSError!) -> Void