Получение: «Попытка уволить из контроллера представления во время презентации или увольнения» - PullRequest
0 голосов
/ 21 января 2019
  1. Приложение для викторины Swift 4.
  2. Первый взгляд - выберите количество вопросов для решения.(используйте переход к второму виду)
  3. Второй вид - запустите тест -> проверенный ответ и отправьте «правильное» или «неправильное» сообщение в третье представление.(используйте переход к третьему представлению)

Когда появляется третье представление, я получаю сообщение об ошибке:

Попытка удалить из контроллера представленияво время презентации или отклонения!

Я пытался использовать:

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute:....

Предупреждающее сообщение исчезает, но проблема в том, что у меня нет доступа ко всемпеременные, которые я получил из второго представления для использования в третьем представлении.

override func viewDidLoad() {
    super.viewDidLoad()

    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
        if self.answerStatus == "Correct!" {
            self.correctWrongStatusLabel.text = self.answerStatus
            self.praiseLabel.text = "Good job!"
            self.correctAnswerIsLabel.text = ""
            let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
            self.fireTimer()

        } else if self.answerStatus == "Wrong!" {
            self.correctWrongStatusLabel.text = self.answerStatus
            self.praiseLabel.text = "Maybe next time!"
            self.correctAnswerIsLabel.text = "回答 : \(self.correctAnswerIs)"
            let timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
            self.fireTimer()
        }
    })

@objc func fireTimer() {
    delegate?.answerStatusReceived(answerStatusString: answerStatusString)
    self.dismiss(animated: true, completion: nil)
}

После того, как второе представление появляется вместе с опросом, когда пользователь выбирает ответ, он проверяет его на соответствие правильному ответу и отображаетответ о том, что ответ правильный или неправильный.представление ответа должно автоматически закрываться после отображения в течение XX секунд.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

просто используйте: - отклонить (анимированный: истина, завершение: ноль) и опустить себя

0 голосов
/ 21 января 2019

Я думаю, что вы не можете отключить VC во время загрузки, даже если вы добавляете задержку, но не гарантируете. Попробуйте добавить таймер в viewDidAppear. Кроме того, ваш self.fireTimer() не требуется.

override func viewDidLoad() {
    super.viewDidLoad()

    if self.answerStatus == "Correct!" {
        self.correctWrongStatusLabel.text = self.answerStatus
        self.praiseLabel.text = "Good job!"
        self.correctAnswerIsLabel.text = ""
    } else if self.answerStatus == "Wrong!" {
        self.correctWrongStatusLabel.text = self.answerStatus
        self.praiseLabel.text = "Maybe next time!"
        self.correctAnswerIsLabel.text = "回答 : \(self.correctAnswerIs)"
    }
}

override func viewDidAppear() {
    super.viewDidAppear()

    if self.answerStatus == "Correct!" {
        let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
    } else if self.answerStatus == "Wrong!" {
        let timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
    }
}

@objc func fireTimer() {
    delegate?.answerStatusReceived(answerStatusString: answerStatusString)
    self.dismiss(animated: true, completion: nil)
}
0 голосов
/ 21 января 2019

Вы пытались удалить метод DispatchQueue?

Я бы сделал это так:

    override func viewDidLoad() {
        super.viewDidLoad()

            if self.answerStatus == "Correct!" {
                self.correctWrongStatusLabel.text = self.answerStatus
                self.praiseLabel.text = "Good job!"
                self.correctAnswerIsLabel.text = ""
                let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
                self.fireTimer()

            } else if self.answerStatus == "Wrong!" {
                self.correctWrongStatusLabel.text = self.answerStatus
                self.praiseLabel.text = "Maybe next time!"
                self.correctAnswerIsLabel.text = "回答 : \(self.correctAnswerIs)"
                let timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.fireTimer), userInfo: nil, repeats: false)
                self.fireTimer()
            }
}

    @objc func fireTimer() {
        delegate?.answerStatusReceived(answerStatusString: answerStatusString)
        dismiss(animated: true, completion: nil)
    }

Я думаю, что вы включили функцию FireTimer () внутри метода viewDidLoad, поэтому я бы добавил скобку "}" в строке перед функцией.

Дайте мне знать, если это работает! :)

...