Как обновить статус кнопок, когда пользователь снова открывает приложение? (Свифт 5) - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть вопрос о сохранении последнего статуса кнопок для игры «Hung Person». Используя UserDefaults, я смог сохранить практически весь статус пользователя, когда игра была закрыта (на экране 1 отображается статус игры пользователя во время игры), как вы можете видеть, пользователь выбрал 2 неправильные буквы, которые не были скрыты слова (M и N, которые выделены красным цветом и отключены), и пользователь правильно угадал буквы O, B, C (которые исчезли из алфавита и также отключены).

Screen1

Когда пользователь закрывает приложение и когда оно открывается снова, я смог перезагрузить почти все предыдущие данные последнего воспроизведенного сеанса, за исключением состояния кнопок. Вы можете увидеть это на Screen2. Я использовал UserDefaults, чтобы сохранить и загрузить игру. Я сохраняю статус игры каждый раз, когда пользователь нажимает на любую кнопку (пытаясь угадать символы скрытого слова), и загружаю данные обратно в viewDidLoad().

Screen2

Игра сделана программно, я создал кнопки, используя что-то вроде следующего:

for row in 0..<5 {
        for column in 0..<6 {               
            if counterLetter < 26 {
                let letterButton = UIButton(type: .system)
                letterButton.titleLabel?.font = UIFont.systemFont(ofSize: titleLabelFontSize)
                letterButton.setTitle(englishAlphabet[counterLetter], for: .normal)
                letterButton.isHidden = false
                letterButton.isEnabled = true
                letterButton.alpha = 1
                letterButton.setTitleColor(.red, for: .disabled)
                letterButton.addTarget(self, action: #selector(letterTapped), for: .touchUpInside)
                letterButton.layer.borderWidth = 1
                letterButton.layer.borderColor = UIColor.black.cgColor

                // Button's frame creation
                let frame = CGRect(x: column*widthButton, y: row*heightButton,
                                   width: widthButton, height: heightButton)
                letterButton.frame = frame

                buttonsView.addSubview(letterButton)
                letterButtons.append(letterButton)

                counterLetter += 1
            } else {
                continue
            }
        }
    }

Это в методе letterTapped (внутри части #selector(letterTapped) в предыдущем код), где я сохраняю прогресс пользователя при нажатии любой кнопки алфавита. Как я уже говорил, я вспоминаю последний статус игрока в viewDidLoad().

. Я также пытался сохранить статус кнопок в методе letterTapped, но мне не удалось сохранить или перезагрузить статус кнопок, как у игрока.

Не могли бы вы дать мне, пожалуйста, руку, где я должен использовать userDefaults, чтобы сохранить статус последней сессии алфавитных кнопок, пожалуйста? Так что, когда игроки снова откроют приложение, screen2 будет таким же, как screen1.

Если вы хотите, чтобы я поделился своим кодом, я могу сделать это с готовностью.

Заранее спасибо.

С уважением!

1 Ответ

0 голосов
/ 15 апреля 2020

То, что вы ищете, это KVO, называемое «UIApplicationWillEnterForeground» и «UIApplicationDidEnterBackground»

В вашем viewDidLoad вашего ViewController вы должны сделать следующее:

func viewDidLoad() {

    super.viewDidLoad()

    let notificationCenter =  NotificationCenter.default
    notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
    notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationDidEnterBackground, object: nil)

, затем реализовать эти функции в том же ViewController:

func appMovedToForeground() {
    print("Application moved to Foreground!")
}

func appMovedToBackground() {
    print("Application moved to Background!")
}

теперь, когда ваше приложение переходит в фоновый режим или возвращается на передний план, эти функции будут вызываться

...