Estoy tratando de grabar los datos del acelerómetro del iPhone (mi propio iPhone 5s) y configurar una etiqueta en la pantalla para que los datos utilizando String(format: "%.2f", data) donde los datos es el valor para el eje quiero grabar. Para ello he creado un CMMotionManager y comenzó a grabar los datos del acelerómetro, y tengo un temporizador que se actualiza constantemente, el texto de la etiqueta. Sin embargo, estoy recibiendo un error de Xcode: «fatal error: inesperadamente se encuentra con nil, mientras que desenvolver un valor Opcional». Aquí está el código correspondiente:

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

}

El error se detiene cuando me cambio el accelX.el texto de la asignación de una simple cadena de caracteres, así que creo que la variable opcional de la creación de el error es algo para hacer con el acelerómetro. Eso es por lo que yo sé, sin embargo, por lo que si usted tiene alguna sugerencia, o si estoy haciendo es completamente equivocado y hay un mejor y más fácil manera, yo sin duda le agradecería que me ayudara.

En la línea de hacer de obtener el error? Supongo que en el accelX.text = ... línea? Lo primero es lo primero, la accelerometerData miembro de su motionManager puede ser nil, así que usted debe comprobar que primero antes de asumir que no hay valor que se muestra. Como este: if let accelData = motionManager.accelerometerData { accelX.text = String(format: "%.2f", accelData.acceleration.x) }.
Tenga en cuenta que en lugar de manualmente utilizando un NSTimer, usted también puede pedir iOS para actualizar periódicamente con los datos del acelerómetro. Más info aquí: developer.apple.com/library/ios/documentation/CoreMotion/…:.
Que arreglen, gracias! Tengo un par de dudas. ¿Por qué es accelerometerData un valor opcional (es decir, ¿por qué no siempre tienen un valor cuando el temporizador y el acelerómetro están a la misma velocidad (10 fps)), y ¿cómo sabe que era un valor opcional?
Compruebe la Manzana docs para que la propiedad específica: developer.apple.com/library/ios/documentation/CoreMotion/…. Dice var accelerometerData: CMAccelerometerData! { get }. El ! significa Opcional, y la descripción de abajo lo dice todo. Creo que es porque cuando usted pide iOS para iniciar el monitoreo de los datos de aceleración, en el principio de que los datos no está inicializado, y se convierte en instancia después de una fracción de un segundo, supongo.
Por el camino, más precisamente, ! significa «explícitamente envueltos opcional», que significa que es un regular opcional que puede ser utilizado sin desenvolver, como lo hizo. Sin embargo, todavía puede ser nil (como testigo) y todavía puede causar un error en tiempo de ejecución si no comprobarlo primero.

OriginalEl autor | 2015-01-04

2 Comentarios

  1. 9

    NSHipster tiene un buen artículo para hablar sobre el núcleo del movimiento: http://nshipster.com/cmdevicemotion/

    Una mejor manera de actualizar periódicamente la interfaz de usuario con movimiento de datos es el uso de la fraseología como se muestra a continuación:

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

    OriginalEl autor Xiaojun

  2. 1

    usted puede obtener el valor de x, y o z e imprimir alerta de valor que desea

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

    OriginalEl autor gihanshox

Dejar respuesta

Please enter your comment!
Please enter your name here