获取:"Attempt to dismiss from view controller while a presentation or dismiss is in progress"

Getting : "Attempt to dismiss from view controller while a presentation or dismiss is in progress"

  1. A Swift 4 测验应用程序。
  2. 第一个视图 - select 个要解决的问题。 (使用 segue 到第二个视图)
  3. 第二个视图 - 开始测验 -> 检查答案并发送 "correct" 或 "wrong" 消息到第三个视图。 (使用 segue 方式到第三视图)

当出现第三个视图时,我收到错误消息:

Attempt to dismiss from view controller <XXX.StartQuizViewController: 0x7fc893f09770> while a presentation or dismiss is in progress!

我试过使用:

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)
}

第二个视图随测验出现后,当用户select回答时,它会与正确答案进行核对,并显示一个回答,说明答案是正确的还是错误的。响应视图必须在显示 XX 秒后自动关闭。

您是否尝试过删除 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)
    }

我认为您在 viewDidLoad 方法中包含了函数 FireTimer(),所以我会在该函数之前的行中添加一个方括号“}”。

如果有效请告诉我! :)

简单地使用:-- dismiss(animated: true, completion: nil) 并省略 self

我认为您不能在加载时关闭 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)
}