pressesEnded в tvOS не вызывается

Я занимаюсь разработкой игры для TVOS в быстром спрайтеките. Существует контроллер представления A, который представляет SKScene B. Я пересылаю прессы Beg и прессы, округленные от A до B.

pressesBegan вызывается в A и пересылается в B, но нажатие Ended даже не вызывается в A. Я не понимаю почему?

Ниже приведены функции, реализованные в A.

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
    if ((self.view as! SKView).scene?.isMemberOfClass(GameScene) == true){
        let gameScene = (self.view as! SKView).scene as! GameScene
        gameScene.pressesEnded(presses, withEvent: event)
    }

}

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {

    if ((self.view as! SKView).scene?.isMemberOfClass(GameScene) == true){
        let gameScene = (self.view as! SKView).scene as! GameScene
        gameScene.pressesBegan(presses, withEvent: event)
    }
}

3 ответа

Я также столкнулся с этой ситуацией.

После некоторого тестирования кажется, что когда кнопка 'select' отпущена, tvOS вызывает либо pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) ИЛИ ЖЕ pressesCancelled(_ presses: Set<UIPress>, with event: UIPressesEvent?),

Что касается того, почему это, я не знаю. Там нет ничего, что я делаю по-разному между каждым нажатием кнопки. Может быть ошибка в tvOS.

Я нашел это решение, перейдя к определению pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) и найти этот комментарий:

Ваш респондент будет получать pressesEnded:withEvent или pressesCancelled:withEvent: за каждое нажатие, которое он обрабатывает (те нажатия, которые он получил в pressesBegan:withEvent:).

Вот ссылка на вопрос, который я задавал о той же проблеме.

Похоже, есть какая-то ошибка, где pressesEnded не звонят вовремя. Я заметил, поставив точку останова на pressesEnded а также pressesBegan, Это всегда останавливается на pressesBegan, но только останавливается на pressesEnded после ожидания секунды, чтобы продолжить.

Единственный обходной путь, который я мог найти, это добавить это в viewDidLoad:

let menuPressRecognizer = UITapGestureRecognizer()
menuPressRecognizer.addTarget(self, action: #selector(ShowListViewController.menuButtonAction))
menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
self.view.addGestureRecognizer(menuPressRecognizer)

И тогда это:

func menuButtonAction() {
    print("menu pressed")
    UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
}

Это быстрый 3, кстати.

Просто столкнулся с этим сам.

Я считаю, что происходит, если вы переопределите метод:

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event

И не вызывайте super внутри метода где-нибудь:

[super pressesBegan:presses withEvent:event];

PressEnded также никогда не вызывается.

У меня была ситуация, когда иногда вызывался pressesEnded, а иногда - нет, и это единственное отличие, которое я мог заметить.

Другие вопросы по тегам