我正在尝试记录iPhone加速度计的数据(我的iPhone 5s),并使用String(format: "%.2f", data)
将数据标记在屏幕上,其中data是我要记录的特定轴的值。为此,我设置了一个CMMotionManager并开始记录加速度计数据,并且我有一个定时器不断更新标签中的文本。然而,Xcode给出了一个错误:"fatal error: unexpectedly found nil while unwrapping an Optional value"。以下是相关的代码:
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赋值更改为简单字符串时,错误停止了,因此我认为创建错误的可选变量与加速计有关。就我所知,如果您有任何建议,或者如果我完全错了,并且有更好、更容易的方法,我肯定会感激您的帮助。
accelX.text = ...
这一行吗?首先,你的motionManager
的accelerometerData
成员可能为nil
,所以你必须先检查它是否有值可显示。像这样:if let accelData = motionManager.accelerometerData { accelX.text = String(format: "%.2f", accelData.acceleration.x) }
。 - Romain。
!`表示可选项,下面的描述已经说明了一切。我认为这是因为当您要求iOS开始监视加速度数据时,一开始该数据未初始化,并在几分之一秒后实例化。 - Romainnil
(正如你所见),如果您没有首先检查它,仍然可能会导致运行时错误。 - Romain