无法推送或呈现视图控制器

Posted

技术标签:

【中文标题】无法推送或呈现视图控制器【英文标题】: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)

【问题讨论】:

【参考方案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: 在发生现有转换或演示时调用 ;导航堆栈不会更新。

以上是关于无法推送或呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭已呈现未推送的多个视图控制器?

如何将视图控制器从视图控制器推送为全屏幕,呈现为半模式

从 iOS 中呈现的视图控制器推送视图

如果当前视图控制器被呈现并推送,如何展开到正确的视图控制器?

在关闭作为模型视图本身的视图 1 时呈现视图(全屏)控制器

如何从呈现的视图控制器上的按钮操作推送视图控制器