ios - 从控制器外部呈现视图控制器,不传递自引用
问题描述
我有一个应用程序,其中有管理员和普通用户,管理员可以删除用户。删除用户后,我需要显示您已被删除。我从服务器获取 apn,据此我必须向他展示视图控制器,解释为什么会发生这种情况并清除他的所有数据。目前,一旦我收到 apn,我就会发布一个通知,该通知由显示该视图控制器的视图控制器接收。
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
self.present(viewController, animated: true) {
print("Presented")
}
现在项目的规模越来越大,所以现在我将 self 的引用传递给一个函数来基本上做同样的事情
userInactivated(viewController: self)
从所有视图控制器中,函数中都存在帐户锁定视图控制器
有没有办法让我直接显示当前视图控制器引用的帐户锁定视图控制器,或者我可以得到这个值我找到了这个但是
if let presentingViewController = self.appDelegate.window?.rootViewController?.presentingViewController {}
但是在非视图控制器类中没有 self.appDelegate
感谢任何帮助谢谢
解决方案
您可以使用此扩展程序
extension UIApplication
{
class func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController?
{
if let nav = base as? UINavigationController
{
let top = topViewController(nav.visibleViewController)
return top
}
if let tab = base as? UITabBarController
{
if let selected = tab.selectedViewController
{
let top = topViewController(selected)
return top
}
}
if let presented = base?.presentedViewController
{
let top = topViewController(presented)
return top
}
return base
}
}
然后您可以使用此代码从任何地方展示您的控制器
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
UIApplication. topViewController()?.present(viewController, animated: true) {
print("Presented")
}
推荐阅读
- shell - 变量的每个字符串的 printf pwd
- amazon-web-services - 需要有关数据管道创建的设计输入
- single-sign-on - 从 Gmail 启动第三方 SSO 会发送 502 错误
- laravel - 在 Auth 中间件强制用户登录后存储表单数据?
- node.js - npm start 命令在 Linux 服务器上不起作用
- azure - Azure 事件网格未将事件发送到 webhook
- r - 安装“qdap”包
- reactjs - 如何在 ReactJS 中集成 API?
- python - Python:适合两个依赖函数
- web-services - 响应没有从一个服务返回到另一个服务 - 微服务