据我所知,这将在Objective-C中运行:
self.window.rootViewController.class == myViewController
如何检查当前视图控制器是否为特定控制器?
Answers:
要在Swift中检查类,请使用“ is”(如《 Swift编程指南》中“类型转换”一章中“检查类型”中所述)
if self.window.rootViewController is MyViewController {
//do something if it's an instance of that class
}
self.window
不存在
self
在这种情况下是什么?您将代码放在哪里?self.window和rootViewController在AppDelegate中。需要更多信息。
更新为swift3编译器适合!和?
if let wd = UIApplication.shared.delegate?.window {
var vc = wd!.rootViewController
if(vc is UINavigationController){
vc = (vc as! UINavigationController).visibleViewController
}
if(vc is LogInViewController){
//your code
}
}
self.window
使用self.view.window
如果您使用的是导航控制器,则可以轻松地遍历视图控制器。然后,您可以按以下方式检查特定实例:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
struct
班级内部怎么办?
我必须在AppDelegate中找到当前的viewController。我用这个
//at top of class
var window:UIWindow?
// inside my method/function
if let viewControllers = window?.rootViewController?.childViewControllers {
for viewController in viewControllers {
if viewController.isKindOfClass(MyViewControllerClass) {
println("Found it!!!")
}
}
}
试试这个
if self is MyViewController {
}
要摆脱Thapa的答案,您需要在使用之前强制转换为viewcontroller类。
if let wd = self.view.window {
var vc = wd.rootViewController!
if(vc is UINavigationController){
vc = (vc as! UINavigationController).visibleViewController
}
if(vc is customViewController){
var viewController : customViewController = vc as! customViewController
迅捷3
不确定你们,但是我在这方面遇到了困难。我做了这样的事情:
if let window = UIApplication.shared.delegate?.window {
if var viewController = window?.rootViewController {
// handle navigation controllers
if(viewController is UINavigationController){
viewController = (viewController as! UINavigationController).visibleViewController!
}
print(viewController)
}
}
我一直在获取应用程序的初始视图控制器。由于某种原因,它无论如何都希望保留根视图控制器。所以我只是做了一个全局字符串类型变量,currentViewController
并在每个变量中自己设置了它的值viewDidLoad()
。我所需要的只是告诉我在哪个屏幕上,这对我来说非常合适。
雨燕3 | 检查视图控制器是否是其内部的根。
您可以window
从视图控制器内部进行访问,只需使用即可self.view.window
。
上下文:当设备旋转时,我需要更新视图的位置并触发动画。我只想在视图控制器处于活动状态时执行此操作。
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(deviceDidRotate),
name: .UIApplicationDidChangeStatusBarOrientation,
object: nil
)
}
func deviceDidRotate() {
guard let window = self.view.window else { return }
// check if self is root view controller
if window.rootViewController == self {
print("vc is self")
}
// check if root view controller is instance of MyViewController
if window.rootViewController is MyViewController {
print("vc is MyViewController")
}
}
}
如果在MyViewController处于活动状态时旋转设备,则会看到上述行打印到控制台。如果MyViewController不处于活动状态,则不会看到它们。
如果您好奇为什么用我UIDeviceOrientationDidChange
代替.UIDeviceOrientationDidChange
,请看这个答案。
if let index = self.navigationController?.viewControllers.index(where: { $0 is MyViewController }) {
let vc = self.navigationController?.viewControllers[vcIndex] as! MyViewController
self.navigationController?.popToViewController(vc, animated: true)
} else {
self.navigationController?.popToRootViewController(animated: true)
}
我的建议是对上述Kiran答案的一种修改。我在项目中使用了它。
迅捷5
// convenience property API on my class object to provide access to the my WindowController (MyController).
var myXWindowController: MyController? {
var myWC: MyController?
for viewController in self.windowControllers {
if ((viewController as? MyController) != nil) {
myWC = viewController as? MyController
break
}
}
return myWC
}
// example of use
guard let myController = myXWindowController else {
reportAssertionFailure("Failed to get MyXController from WindowController.")
return
}