无法推送或呈现视图控制器
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: 在发生现有转换或演示时调用 以上是关于无法推送或呈现视图控制器的主要内容,如果未能解决你的问题,请参考以下文章