2017-02-02 6 views
3

Мое приложение использует CoreMotion, чтобы позволить игроку перемещаться при наклоне устройства. Он отлично работал в Swift 2, но когда я обновил его до Swift 3, он перестал работать. Я не получаю никаких обновлений акселерометра.Акселерометр в CoreMotion не работает в Swift 3

override func didMove(to view: SKView) { 
    manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = 0.1 
    manager.startAccelerometerUpdates(to: OperationQueue.main){ (data, Error) in 
     if let accelerometerData = self.manager.accelerometerData { 
      self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10, dy: accelerometerData.acceleration.x * 10) 
     } 
    } 
} 
+0

Вы сказали: «он прекратил работать». Я могу только предположить, что вы имеете в виду, что он компилируется и работает отлично, но ваш обработчик никогда не называется. Это правильно? – Coder256

ответ

2

NSError был переименован в Error в Swift 3, поэтому, пожалуйста, сделать свой Error переменную верблюжьего (в нижнем регистре в вашей ситуации). Это должно было быть camelCase, так как это переменная, так или иначе.

Вот новая версия функции с тем, что и другими незначительными ошибками фиксированных (ПРИМЕЧАНИЯ МОЕГО КОММЕНТАРИЯ О подкачке X И Y):

override func didMove(to view: SKView) { 
    manager.accelerometerUpdateInterval = 0.1 
    manager.startAccelerometerUpdates(to: OperationQueue.main) { data, _ in 
     if let accelerometerData = data { 
      // IMPORTANT: Are you intentionally swapping x and y here? -----------> ↓ 
      self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10, 
               dy: accelerometerData.acceleration.x * 10) 
     } 
    } 
} 

А вот первоначальная функция только с переменным переименованным (Примечание: Есть несколько ошибок программирования здесь, я не рекомендую использовать его):

override func didMove(to view: SKView) { 

    manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = 0.1 
    manager.startAccelerometerUpdates(to: OperationQueue.main) { (data, error) in 

     if let accelerometerData = self.manager.accelerometerData { 
      self.physicsWorld.gravity = CGVector(dx: accelerometerData.acceleration.y * 10, dy: accelerometerData.acceleration.x * 10) 
     } 

    } 
} 

EDIT: Вы не должны использовать основную очередь, что OperationQueue для ПОЛУЧАТЬ обновление акселерометра. См. Apple's documentation.

+0

Я попытался использовать ваше решение, но он по-прежнему не вызывает акселерометр, я получаю сообщение в журнале «если мы находимся в реальном обработчике pre-commit, мы не можем фактически добавлять новые заборы из-за ограничения CA ». Я не уверен, что это проблема. – Euan

+0

Вы уверены, что обработчик не вызван? Попробуйте поставить: 'print (« Получил данные акселерометра: \ (accelometerData) »)' после строки 'if let accelometerData ...'. Кроме того, какую версию кода вы используете? – Coder256

+0

Я уверен, что обработчик не вызывается, в журнале отображается только '[App], если мы находимся в реальном обработчике pre-commit, мы не можем фактически добавлять какие-либо новые ограждения из-за ограничения CA' Im, используя код вы предложили выше – Euan

Смежные вопросы