Как вызвать указатель c UIB по тегу, отличному от отправителя? - PullRequest
2 голосов
/ 01 февраля 2020

В простой игре памяти у меня есть структура, которая определяет две карты, которые были нажаты, и возвращает в мутирующих функциях целые числа firstFlippedCard и secondFlippedCard.

Если они не совпадают по другому свойству, я хочу обе карты «перевернуть». Я сделал функцию перехода для этого - однако, я могу сделать только последнюю нажатую кнопку, чтобы переключиться назад, используя следующие логи c:

    @IBAction func cardsPress(_ sender: UIButton) {

        flip(sender: sender)

        if cardBrain.checkFirstCard(card: sender.tag - 1) == true {
            //stay flipped
        } else if cardBrain.checkForMatch(card: sender.tag - 1).match == true {
            //stay flipped
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute:  {
                self.backFlip(sender: sender)
            })
        }


    }

Обратите внимание, что несколько кнопок UIB связаны с cardsPress. Как я могу заставить их обоих перевернуться вместо одного отправителя?

1 Ответ

2 голосов
/ 02 февраля 2020

Добавить свойство, чтобы отслеживать нажатие previousButton. Затем используйте это свойство, чтобы перевернуть как текущие sender, так и previousButton. Наконец, установите previousButton обратно на nil после переворачивания или принятия решения оставить его перевернутым.

var previousButton: UIButton?
var waitForFlip = false

@IBAction func cardsPress(_ sender: UIButton) {

    // ignore button input while waiting for cards to unflip
    guard !waitForFlip else { return }

    flip(sender: sender)

    if cardBrain.checkFirstCard(card: sender.tag - 1) {
        //stay flipped
        previousButton = sender
    } else if cardBrain.checkForMatch(card: sender.tag - 1).match  {
        //stay flipped
        previousButton = nil
    } else {
        waitForFlip = true
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute:  {
            self.backFlip(sender: sender)
            if let button = previousButton {
                self.backFlip(sender: button)
                self.previousButton = nil
            }
            self.waitForFlip = false
        })
    }

}

Примечания:

  • Существует вероятность того, что игрок может начать переворачивать другую карту до того, как предыдущие вернутся назад. Я ввел свойство waitForFlip, чтобы игнорировать нажатия кнопок, пока мы ожидаем, что несовпадающие карты перевернутся назад, чтобы избежать проблемы, когда previousButton устанавливается и затем перезаписывается на nil при предыдущем откате.

  • Нет необходимости проверять, является ли значение Bool == true. Просто отметьте if boolValue { вместо if boolValue == true. Я удалил два экземпляра этого.

  • Возможно, вы захотите отключить кнопки перевернутых карт (установите sender.isEnabled = false), чтобы игрок не мог выбрать перевернутую карту. Не забудьте включить их снова, когда они перевернуты, установив их свойства isEnabled в true.

...