如何在iOS中使用Swift正确检索加速度计数据?

时间:2015-01-04 18:09:17

标签: ios iphone swift core-motion

我正在尝试从iPhone的加速度计(我自己的iPhone 5s)记录数据,并使用String(format: "%.2f", data)在屏幕上为该数据设置标签,其中data是我要记录的特定轴的值。为此,我设置了CMMotionManager并开始记录加速度计数据,我有一个定时器,可以不断更新标签中的文本。但是,我从Xcode收到错误:“致命错误:在展开Optional值时意外发现nil”。以下是相关代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //if accelerometer can be used, start it
    if (motionManager.accelerometerAvailable) {

        motionManager.accelerometerUpdateInterval = 0.1

        motionManager.startAccelerometerUpdates()
        let timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
    }



}

func update () {
    if (motionManager.accelerometerActive) {

        accelX.text = String(format: "%.2f", motionManager.accelerometerData.acceleration.x)
    }

}

当我将accelX.text赋值更改为简单字符串时,错误停止,因此我认为创建错误的可选变量与加速度计有关。然而,据我所知,如果你有任何建议,或者我完全错了,并且有更好更简单的方法,如果你帮助我,我一定会很感激。

2 个答案:

答案 0 :(得分:9)

NSHipster有一篇很好的文章来讨论核心议案:http://nshipster.com/cmdevicemotion/

使用动态数据定期更新UI的更好方法是使用如下所示的模式:

if manager.accelerometerAvailable {
     manager.accelerometerUpdateInterval = 0.1
     manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
     [weak self] (data: CMAccelerometerData!, error: NSError!) in
          accelX.text = String(format: "%.2f", data.acceleration.x)
     }
}

答案 1 :(得分:1)

您可以获得x或y或z的值并打印您想要的值的警报

motionManager.accelerometerUpdateInterval = 5.0
motionManager.startAccelerometerUpdates(to: OperationQueue.current!) { (data, error) in
        if let myData = data{
            print(myData)
            if myData.acceleration.y < -0.2{
                let alert = UIAlertController(title: "Message ", message: "new text", preferredStyle: UIAlertControllerStyle.alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

            }
        }
}