Когда текст UITextView обновляется на экране?

Моя проблема, вероятно, очень проста, но я новичок в этом. Я делаю игру Hangman в Swift. Слово превращается в подчеркивание в View Model, и View Controller привязывается к нему как реактивная переменная. Каждый раз, когда вводится письмо, UITextView.text обновляется и, конечно, отображается на экране.
Но когда я введу последнюю правильную букву, она не будет обновляться сразу. Я думаю, что он обновляется только после того, как действие "buttonPressed" завершено, но поскольку ViewModel каждый раз проверяет, закончилась ли игра или нет, когда игра окончена, она автоматически инициализируется повторно (через 2 секунды приостановка usleep(), так что пользователь может греться во славе того, что завершила слово).
Когда именно, по какому событию на экране появится обновление UITextView.text? И как мне это сделать, когда мне это нужно?

Я пробовал основные вещи, которые вы ожидаете: "setNeedsDisplay", "setNeedsLayout", в основном все, что "нуждалось" в нем. Те, что на самом UITextView, но также пытались viewDidLayoutSubviews и viewDidAppear.

ViewController:

@IBOutlet weak var wordShown: UITextView!

@IBAction func didTouchLetter(_ sender: UIButton) {
  viewModel.letterButtonDidPress(index: sender.tag)
}

private func bind(to viewModel: MainViewModel) {
  viewModel.currentWord = { [weak self] word in
    self?.wordShown.text = word
  }
}

ViewModel:

var currentWord: ((String) -> Void)?
private var wordToBeShown = "" {
  didSet {
    currentWord?(wordToBeShown)
  }
}

func viewDidLoad() {
  getWord() // simply gets a word from dictionary and store it
  updateWordToBeShown()

func letterButtonDidPress(index: Int){
  if !lettersAlreadyFound.contains(alphabet[index]) {
    lettersAlreadyFound.append(alphabet[index]
  }
  updateWordToBeShown()
  reinitializeGameIfItsOver()
}

private func reinitializeGameIfItsOver() {
  if !wordToBeShown.contains("_") {
    usleep(useconds_t(200*100*100)) // 2 seconds
    resetEveryVariable()
    self.viewDidLoad()
  }
}

updateWordToBeShown () проверяет, присутствует ли введенная буква в слове, которое нужно угадать, и если это так, и помещает буквы или подчеркивания в wordToBeShown соответственно.

Мне нужно обновить экран, когда вызывается updateWordToBeShown. UITextView.text обновлен правильно, я проверил, он просто не будет отображаться на экране, пока не закончится VC.didTouchLetter. Но так как слово повторно инициализируется до этого, завершенное слово никогда не отображается на экране.

NB: если я уберу функцию переустановки, игра застревает после того, как слово закончено, но оно показывает завершенное слово на экране.

0 ответов

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