class TopViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Code Block 1
let controller = getTopController()
print(controller)// Prints out MyTestProject.TopViewController
//Code Block 2
let controller2 = getRootController()
print(controller2)//Prints out nil , because keywindow is also nil upto this point.
//Code Block 3
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.5) {
let controller2 = self.getRootController()
print(controller2)// Prints out MyTestProject.TopViewController
}
}
func getTopController() -> UIViewController? {
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let sceneDelegate = windowScene.delegate as? SceneDelegate else {
return nil
}
return sceneDelegate.window?.rootViewController
}
func getRootController() -> UIViewController? {
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
let topController = keyWindow?.rootViewController
return topController
}
}
自iOS 13以来,有两种方法可以获取应用程序当前活动/顶部视图控制器。这里:getTopController()和getRootController()显示了这两种方法。
如代码中所述,除了print()结果之外,两者的结果是不同的。
在代码块2中:getRootController无法找到窗口,因此打印出nil。为什么会发生这种情况?
另外,在iOS 13中获得参考最高控制器的全面方法是什么?我现在感到困惑了。
isKeyWindow
为 false,因为尚未调用window.makeKey()
。 - Mario