Проблема при определении местоположения касания внутри контроллера представления в iOS

#ios #swift #xcode

#iOS #swift #xcode

Вопрос:

Я использую следующий код для определения местоположения касания внутри моего контроллера представления, но, когда я выхожу из контроллера представления, он по-прежнему обнаруживает мое касание за пределами этого конкретного контроллера представления, что приводит к сбою в приложении. Я был бы признателен, если бы кто-нибудь мог сообщить мне, как мне исправить мою функцию touchesbegan, чтобы устранить эту проблему? Спасибо!

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  // First touch to start the game
  if gameState == .ready {
    startGame()
  }
  
    if let touchLocation = event?.allTouches?.first?.location(in: self.view) {
    // Move the player to the new position
    movePlayer(to: touchLocation)
    
    // Move all enemies to the new position to trace the player
    moveEnemies(to: touchLocation)
  }

}
  

Это код, который вызывается после окончания игры :-

 func displayGameOverAlert() {
  let (title, message) = getGameOverTitleAndMessage()
  let alert = UIAlertController(title: "Game Over", message: message, preferredStyle: .alert)
  let action = UIAlertAction(title: title, style: .default,
                             handler: { _ in
                              self.prepareGame()
    }
  )
  let action_2 = UIAlertAction(title: "Main Menu", style: .default, handler: { _ in
                                    self.performSegue(withIdentifier: "2to1segue", sender: self)})
  alert.addAction(action)
  alert.addAction(action_2)
  self.present(alert, animated: true, completion: nil)
}
  

Комментарии:

1. Я чувствую, что отсутствует какой-то соответствующий код, например, как вы закрываете / закрываете ViewController .

2. @JeroenJK Я обновил свой вопрос кодом, который выполняет переход с другим контроллером представления после выхода из контроллера представления игры

3. Итак, вы не отклоняете VC, а скорее отображаете предупреждение над ним. Вы могли бы, например, использовать gameState inside touchedBegin . Например guard gameState == .active else { return } .

4. Сработало ли это как решение для вас? Я опубликовал это как ответ для ясности.

Ответ №1:

Трудно сказать, что именно идет не так, поскольку присутствует не весь код. Но одним из возможных решений является следующее:

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // First touch to start the game
    if gameState == .ready {
        startGame()
    }

    // Check if the game is currently active. If not, return from the function to avoid moving the player.       
    guard gameState == .active else { return }

    if let touchLocation = event?.allTouches?.first?.location(in: self.view) {
        // Move the player to the new position
        movePlayer(to: touchLocation)
    
        // Move all enemies to the new position to trace the player
        moveEnemies(to: touchLocation)
    }
}
  

Причина touchesBegan , по которой все еще вызывается, заключается в том, что вы отправляете предупреждение поверх viewController , но не отклоняете его.