Как постоянно проверять, нажата ли клавиша перед продолжением?

#ios #swift #sprite-kit

#iOS #swift #sprite-kit

Вопрос:

Я пытаюсь постоянно проверять, нажата ли клавиша. Как только это произойдет, я хочу запустить блок кода. Вот как я пытаюсь реализовать это на данный момент:

 func someFunctionCall {
  //do stuff here
  //check until key is pressed
  while(!spacePressed) {
    if(spacePressed) {
      //do more stuff in here
    }
  }
} 
  

И вот где я обнаруживаю нажатия клавиш:

 public override func keyDown(with event: NSEvent) { 
     switch Int(event.keyCode) {
     case kVK_Space:
    spacePressed = true
     default:
    break
     }
}

public override func keyUp(with event: NSEvent) {   
     switch Int(event.keyCode) {
     case kVK_Space:
    spacePressed = false
     default:
    break
     }
}
  

Я хочу, чтобы цикл while непрерывно проверял нажатие клавиши, пока это не произойдет. Когда я запускаю свою программу, она зависает при запуске цикла while (я предполагаю, что она застряла в бесконечном цикле). Это вообще правильный способ решения проблемы?

Ответ №1:

Похоже, что ваш «Основной поток» постоянно выполняет ваш цикл, поэтому не может выполнить другие инструкции.

Таким образом, вы могли бы вызывать свою функцию, когда ваш пробел нажат.

Что-то вроде этого:

 var timer:Timer?   

func someFunctionCall() {
   // do exterior loop stuff here
} 




func didSpaceDown(){
timer =  Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { (timer) in
       //Do your inside loop stuff here
    }
}

 override func keyDown(with event: NSEvent) { 
     if Int(event.keyCode) == KVK_Space{
             didSpaceDown()
         }
 }

 override func keyUp(with event: NSEvent) {   
          if Int(event.keyCode) == KVK_Space{
            timer.invalidate()
         }
 }
  

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