#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
insidetouchedBegin
. Например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
, но не отклоняете его.