【问题标题】:Get all list of UIViewControllers in iOS Swift获取 iOS Swift 中的所有 UIViewController 列表
【发布时间】:2016-07-26 07:47:20
【问题描述】:

有什么方法可以获取 iOS Swift 项目中的所有 UIViewControllers。我想获取所有 UIViewControllers 的数组并检查特定的 UIViewController 是否存在。我必须在项目中找到特定的 UIViewController 是否存在。

【问题讨论】:

  • 你是在使用 UINavigationController 还是仅仅展示你的 UIViewControllers?
  • 您可以通过创建它们的一个实例来检查它们是否存在,但不能全部获取,除非您为它们中的每一个提供标识符并将其存储为枚举或数组

标签: ios swift uiviewcontroller


【解决方案1】:

你可以用下面的代码来做。

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

if let viewControllers = appDelegate.window?.rootViewController?.presentedViewController
{
    // Array of all viewcontroller even after presented
}
else if let viewControllers = appDelegate.window?.rootViewController?.childViewControllers
{
    // Array of all viewcontroller after push                            
}

Swift 4.2 (XCode 10)

let appDelegate = UIApplication.shared.delegate as! AppDelegate

if (appDelegate.window?.rootViewController?.presentedViewController) != nil
{
    // Array of all viewcontroller even after presented
}
else if (appDelegate.window?.rootViewController?.children) != nil
{
    // Array of all viewcontroller after push
}

【讨论】:

  • 嗨 Hasya,第一个代码没用。第二部分很有用,但它没有为我提供整个 uiviewcontroller 数组。它只是为我提供了我们通过 RootViewController 传递的视图控制器。意思是,如果我的项目有 50 个视图控制器,并且如果我将在第一个视图上检查您的代码,那么它将仅将第一个视图控制器显示为一个数组。我想你明白我想说什么。我想得到整个 UIViewController 数组。
  • 希望您的项目结构良好。仅当您有导航控制器和推送/弹出视图时,其他部分才会起作用。在通过 UIViewcontrollers 继续之前,您将无法获得整个数组。
  • 好的,谢谢。主要问题是一样的。好的,让我搜索更多,非常感谢:)
  • 将所有视图控制器名称存储在您设置 rootViewController 的 NSUserDefault 中,然后在任何地方使用它。
  • 是的,我确实得到了一个替代方案,我创建了一个 UIViewControllers 数组并相应地附加和使用。
【解决方案2】:

这是我根据上一个答案所做的扩展

使用泛型 + 扩展 (?Swift 5.1)

/**
 * - Returns: ViewController of a class Kind
 * ## Examples: 
 * UIView.vc(vcKind: CustomViewController.self) // ref to an instance of CustomViewController
 */
 public static func vc<T: UIViewController>(vcKind: T.Type? = nil) -> T? {
     guard let appDelegate = UIApplication.shared.delegate, let window = appDelegate.window else { return nil }
     if let vc = window?.rootViewController as? T {
         return vc
     } else if let vc = window?.rootViewController?.presentedViewController as? T {
         return vc
     } else if let vc = window?.rootViewController?.children {
         return vc.lazy.compactMap { $0 as? T }.first
     }
     return nil
 }

【讨论】:

  • 如果appDelegate.window == nil 那么它将不起作用。您还可以遍历根视图控制器及其呈现的和子视图控制器。如果目标更深,您的代码将找不到它!
  • @Vyachaslav Gerchicov 评论不是很清楚。因此,我无法帮助/纠正答案。你能澄清你的担忧吗?谢谢?
  • 你回答的问题是presentedViewController可以有自己的孩子,rootViewController可能是UINavigationController,带有视图控制器数组等等。所以至少这个函数应该是递归的(或者应该有允许避免这种递归的代码)
  • 注明。我用更现代的代码升级了答案。我怀疑它可以解决您的问题。感谢您的澄清。
  • 您没有编辑您的答案。也许你忘了保存它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2017-04-02
  • 2020-01-22
  • 2011-04-14
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多