2016-02-02 2 views
1

print и func call успешно оба раза, но мой фон и название меняются только при перезагрузке моего приложения и работают только 1 раз. Вот мой код:Почему бы не изменить свой фон и название после получения данных акселерометра? SWIFT

var motionManager = CMMotionManager() 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    startMotionManager() 
} 

func startMotionManager() { 

    if motionManager.accelerometerAvailable { 
    motionManager.accelerometerUpdateInterval = 0.2 
    motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: { 
     [weak self] (data, error) in 

     print(data!.acceleration.z) 

     if(data!.acceleration.z > 0.8) { 
      self!.win() 
      print("Win") 
     } 

     if (data!.acceleration.z < -0.9){ 
      self!.pass() 
      print("Pass") 
     } 
     return 
     }) 
    } 

} 

func pass() { 
    print("passfunction") 
    self.testLabel.text = "PASS" 
    self.view.backgroundColor = UIColor.redColor() 
} 

func win() { 
    testLabel.text = "WIN" 
    view.backgroundColor = UIColor.greenColor() 
} 

}

Моя главная цель вызова функ Win при acceleration.z> 0,8, которые изменить название метку «Win» и вид фона на зеленый Если acceleration.z < -0.9 затем вызвать функцию Pass, которая меняет мой фон на красный и т. Д.

Спасибо за вашу помощь!

+0

Убедитесь, что методы UIKit будут вызываться из основного потока! – CouchDeveloper

ответ

1

Я устал весь день решить это. После того, как я разместил свой вопрос, я нашел проблему в своем коде.

func pass() { 
     NSOperationQueue.mainQueue().addOperationWithBlock { 

     self.testLabel.text = "PASS" 
     self.view.backgroundColor = UIColor.redColor() 
     } 
    } 
+0

Правильно - всегда вызывайте методы UIKit в основном потоке. Но обычно использование 'dispatch_async (dispatch_get_main_queue()) {...}' короче. – CouchDeveloper

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