Swift获取当前显示的ViewController轻松搞定
2022-11-15 02:33:32
获取当前显示的 ViewController:终极指南
在 Swift 中
在 iOS 开发中,了解如何获取当前显示的 ViewController 至关重要,因为它是与用户界面交互和管理应用程序状态的关键。本文将深入探讨在 Swift 中获取当前显示的 ViewController 的多种方法,并提供详细的示例。
1. 使用 UIApplication 的 keyWindow 属性
UIApplication.shared.keyWindow 属性返回正在显示的窗口。根视图控制器是窗口的根视图,因此以下代码可用于获取当前显示的 ViewController:
let currentViewController = UIApplication.shared.keyWindow?.rootViewController
2. 使用当前视图的 nextResponder 属性
每个视图都有一个 nextResponder 属性,它返回下一个响应者对象。如果当前响应者是 ViewController,则可以通过以下方式获取它:
var currentViewController: UIViewController? = self
while let nextResponder = currentViewController?.nextResponder {
if nextResponder is UIViewController {
currentViewController = nextResponder as? UIViewController
break
}
}
3. 使用 UIResponder 的 next 属性
UIResponder 协议定义了 next 属性,它与 nextResponder 属性类似。可以使用以下代码获取当前显示的 ViewController:
var currentViewController: UIViewController? = self
while let nextResponder = currentViewController?.next {
if nextResponder is UIViewController {
currentViewController = nextResponder as? UIViewController
break
}
}
4. 使用 UIView 的 findViewController() 方法
UIView 扩展提供了一个 findViewController() 方法,它返回该视图所在 ViewController 的根控制器。对于以下代码,self 代表当前视图:
let currentViewController = self.findViewController()
5. 使用 UIViewController 的 presentedViewController 属性
如果当前 ViewController 已显示模态视图控制器,可以使用 presentedViewController 属性获取它。以下代码获取当前显示的模态 ViewController:
var currentViewController = self.presentedViewController
6. 使用 UIViewController 的 childViewControllers 属性
如果当前 ViewController 是容器视图控制器,可以使用 childViewControllers 属性获取它管理的子 ViewController。以下代码获取当前容器视图控制器的子 ViewController:
var currentViewController: UIViewController? = self
while let parentViewController = currentViewController?.parent {
currentViewController = parentViewController
}
代码示例
以下代码示例演示了如何使用 UIApplication.shared.keyWindow 属性获取当前显示的 ViewController:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 获取当前显示的 ViewController
let currentViewController = UIApplication.shared.keyWindow?.rootViewController
// 检查当前 ViewController 的类型
if let currentViewController = currentViewController {
print("当前显示的 ViewController 是 \(currentViewController)")
} else {
print("无法获取当前显示的 ViewController")
}
}
}
结论
掌握获取当前显示的 ViewController 的方法对于 iOS 开发者至关重要。本文提供了多种方法,从 UIApplication.shared.keyWindow 属性到 UIView.findViewController() 方法,并附有详细的代码示例。通过使用这些方法,开发者可以轻松地与用户界面交互并管理应用程序的状态。
常见问题解答
-
我应该使用哪种方法来获取当前显示的 ViewController?
- 对于大多数情况,使用 UIApplication.shared.keyWindow 属性是最直接的方法。
-
为什么我无法通过 nextResponder 或 next 属性获取 ViewController?
- 确保当前视图是 ViewController 或其子类的子视图。
-
findViewController() 方法适用于所有视图吗?
- 否,它仅适用于属于 ViewController 层次结构的视图。
-
什么时候使用 presentedViewController 属性?
- 当当前 ViewController 已显示模态视图控制器时使用。
-
什么时候使用 childViewControllers 属性?
- 当当前 ViewController 是容器视图控制器时使用。