如何检查当前加载的视图控制器? (ObjC + Swift)

时间:2018-10-23 07:47:30

标签: objective-c swift uiviewcontroller global-variables

在我的应用程序中,我有一个函数,希望它根据所加载的当前视图控制器来打印某些内容。通过设置全局变量(Bool),然后在视图控制器类中切换标志来实现此目的。在我的主班上,我有这样的事情:

var FirstViewControllerisVisible: Bool = false
var SecondViewControllerisVisible: Bool = false
var ThirdViewControllerisVisible: Bool = false

@objc func PlayAgainfunc(_ sender: Any) {
    if counter % 15 == 0 {
        if FirstViewControllerisVisible == true {
            print("First View Controller is visible")
        } else if SecondViewControllerisVisible == true {
            print("Second View Controller is visible")
        } else if ThirdViewControllerisVisible == true {
            print("Third View Controller is visible")
        }
    }
    counter += 1
}

然后,在这些类中,我可以像这样设置标志:

override func viewDidAppear(_ animated: Bool) {
    FirstViewControllerisVisible = true
}

override func viewDidDisappear(_ animated: Bool) {
    FirstViewControllerisVisible = false
}

当它完全是Swift时,这很好用,但是全局变量的问题是,Objective-C无法访问它们。我找不到在ObjC类中设置标志然后检查是对还是错的方法。例如,如果我尝试过:

- (void)viewDidAppear:(BOOL)animated; {
    [(FirstViewControllerisVisible) == true];
}

- (void)viewDidDisappear:(BOOL)animated; {
    [(FirstViewControllerisVisible) == false];
}

我会收到错误消息“使用未声明的标识符”,因为在Swift中声明的全局变量仅是Swift。

2 个答案:

答案 0 :(得分:0)

加载视图控制器后,您可以

if let viewController = UIApplication.shared.keyWindow?.rootViewController {
    print(type(of: viewController))
}

答案 1 :(得分:0)

添加以下提到的扩展名。您将获得理想的结果。

extension UIApplication {
        /// will return currently showing view controller
        static var topMostViewController: UIViewController? {
            return UIApplication.shared.keyWindow?.rootViewController?.visibleViewController
        }
    }

    extension UIViewController {
        /// The visible view controller from a given view controller
        var visibleViewController: UIViewController? {
            if let navigationController = self as? UINavigationController {
                return navigationController.topViewController?.visibleViewController
            } else if let tabBarController = self as? UITabBarController {
                return tabBarController.selectedViewController?.visibleViewController
            } else if let presentedViewController = presentedViewController {
                return presentedViewController.visibleViewController
            } else {
                return self
            }
        }
    }

并按以下方式访问它:

let viewController = UIApplication.topMostViewController

快乐编码