Когда текст 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: если я уберу функцию переустановки, игра застревает после того, как слово закончено, но оно показывает завершенное слово на экране.