【问题标题】:Can't push or present view controller无法推送或呈现视图控制器
【发布时间】:2019-02-20 01:54:39
【问题描述】:

这是当用户按下为我的卡充电按钮时调用的函数。可以为卡充电,但按下按钮后,用户会停留在同一屏幕上。我尝试了推动和展示,但都没有奏效。关于为什么/如何解决这个问题的任何想法?

@objc private func handleChargeCardButtonPressed() {
    guard let last4 = UserDefaults.standard.object(forKey: "last4") as? String else { return }
    chargeCardOnFile(amount: amountToCharge, last4: last4)
    let scanQRVC: UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "cardRegisteredVC")
    navigationController?.pushViewController(scanQRVC, animated: true)
    //present(scanQRVC, animated: true)
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    检查下面的代码。

    我们没有返回空的 userDefaults 值,而是制作了 fatalError。同时检查 navigationController 是否存在。

    @objc private func handleChargeCardButtonPressed() {
        guard
            let last4 = UserDefaults.standard.object(forKey: "last4") as? String
        else {
            // check whether the function returns from here or not?
            // use fataError()
            fatalError("last4 is not present in the user defaults")
        }
        chargeCardOnFile(amount: amountToCharge, last4: last4)
        let scanQRVC: UIViewController = UIStoryboard(name: "Main",
                                                      bundle: nil).instantiateViewController(withIdentifier: "cardRegisteredVC")
    
        // make sure the navigation controller is present.
        guard let navController = navigationController else {
            fatalError("No Navigation Controller present for this view")
        }
        navController.pushViewController(scanQRVC, animated: true)
    }
    

    编辑:

    从讨论中了解到,控制台显示错误:

    当现有的过渡或演示发生时;导航堆栈将不会更新。

    这意味着在尝试新的推送/呈现时现有的导航堆栈正在进行中。 (i) 尝试重构对此呈现/推送到下一个视图控制器的调用,以便上一个调用完成以单击按钮或 (ii) 在推送下一个视图控制器时添加延迟 (DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { })。

    【讨论】:

    • 感谢您的建议。不幸的是,当我尝试您的方法时,问题仍然存在。
    • 添加打印语句或在函数的第一行添加断点,并确保函数被调用。还有按钮的功能是如何映射的?
    • 肯定会被调用,因为会弹出订单成功消息,并且余额会在 firebase 上更新,方形仪表板会显示费用。我不确定您所说的函数是如何与按钮映射的。
    • 你能从主线程调用这个 UI 动作(推送/呈现另一个视图控制器),以确保它不会导致任何异常吗?但理想情况下,这应该显示控制台错误说同样的话。你也试过了present(scanQRVC, animated: true, completion: nil)
    • 是的,我试过了。我尝试了 Dispatch..main 函数,但没有解决问题。我在控制台中看到了这一点: pushViewController:animated: 在发生现有转换或演示时调用 ;导航堆栈不会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多