尝试在视图不在 window 层次结构中的 UITabBarController 上呈现 UIAlertController
Attempt to present UIAlertController on UITabBarController whose view is not in the window hierarchy
我的应用程序委托中有一个计时器,用户在另一个 viewController 不在选项卡栏中的选择器中选择执行该计时器选择器所需的时间间隔;选择时间间隔后,使用模态转场加载 UITabBarController
中的第一个 viewController
当时间间隔过去时,我希望应用程序显示警报,但它给了我这个:警告:尝试在视图不在 window 层次结构中的 UITabBarController 上显示 UIAlertController!
这是我正在使用的代码:
let alert = UIAlertController(title: "alert", message: "test", preferredStyle: .Alert)
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
首先尝试获取可见视图控制器。您可以使用此 public 扩展名执行此操作:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(self.rootViewController)
}
public static func getVisibleViewControllerFrom(vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
} else {
return vc
}
}
}
}
然后在此 vc
中显示警报控制器
我的应用程序委托中有一个计时器,用户在另一个 viewController 不在选项卡栏中的选择器中选择执行该计时器选择器所需的时间间隔;选择时间间隔后,使用模态转场加载 UITabBarController
中的第一个 viewController当时间间隔过去时,我希望应用程序显示警报,但它给了我这个:警告:尝试在视图不在 window 层次结构中的 UITabBarController 上显示 UIAlertController!
这是我正在使用的代码:
let alert = UIAlertController(title: "alert", message: "test", preferredStyle: .Alert)
self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
首先尝试获取可见视图控制器。您可以使用此 public 扩展名执行此操作:
public extension UIWindow {
public var visibleViewController: UIViewController? {
return UIWindow.getVisibleViewControllerFrom(self.rootViewController)
}
public static func getVisibleViewControllerFrom(vc: UIViewController?) -> UIViewController? {
if let nc = vc as? UINavigationController {
return UIWindow.getVisibleViewControllerFrom(nc.visibleViewController)
} else if let tc = vc as? UITabBarController {
return UIWindow.getVisibleViewControllerFrom(tc.selectedViewController)
} else {
if let pvc = vc?.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(pvc)
} else {
return vc
}
}
}
}
然后在此 vc
中显示警报控制器