Reputation: 4632
import UIKit
import CoreMotion
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let manager = CMMotionManager()
if manager.accelerometerAvailable {
println("accelerometerAvailable = true")
manager.accelerometerUpdateInterval = 0.01
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
[weak self] (data: CMAccelerometerData!, error: NSError!) in
println("inside")
println(data)
println("x: \(data.acceleration.x)")
println("y: \(data.acceleration.y)")
println("z: \(data.acceleration.z)")
self?.label.text = "Kashif"
self?.label.text = String(format: "%.2f", data.acceleration.x)
}
}
}
}
I have already linked CoreMotion framework. My console output is only
accelerometerAvailable = true
I am not getting updated label or any of the other console output. What am I missing?
Upvotes: 0
Views: 295
Reputation: 93296
Your CMMotionManager
instance is scoped to the viewDidLoad
method, so it's being deallocated after the method finishes. Thus there's nothing that can send updates to your queue. You want to create the CMMotionManager
as a view controller property, or of your app delegate if you'll need it across multiple VCs (since you should only be creating one app-wide).
class ViewController: UIViewController {
// move the manager out here
let manager = CMMotionManager()
// everything else should work fine
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
if manager.accelerometerAvailable {
println("accelerometerAvailable = true")
manager.accelerometerUpdateInterval = 0.01
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
[weak self] (data: CMAccelerometerData!, error: NSError!) in
println("inside")
println(data)
println("x: \(data.acceleration.x)")
println("y: \(data.acceleration.y)")
println("z: \(data.acceleration.z)")
self?.label.text = "Kashif"
self?.label.text = String(format: "%.2f", data.acceleration.x)
}
}
}
}
Upvotes: 2