gpt4 book ai didi

ios - 调用 rootViewController 后导航 Controller 不显示

转载 作者:行者123 更新时间:2023-11-30 11:58:44 24 4
gpt4 key购买 nike

我对 Swift 比较陌生尝试使用 peek 和 pop PreviewActionItems“编辑”在编辑模式下打开 SpeciesDetailViewController。尝试让 segue 显示 SpeciesDetailViewController 时遇到问题,并收到错误消息“警告:尝试显示其 View 不在窗口层次结构中的 SpeciesDetailViewController”。我在 found here 上实现了 Jacob Davis 的解决方案。

这修复了窗口层次结构错误,但是当调用 SpeciesDetailViewController Controller 时,导航 Controller 和 tabBarController 都不会显示。

enter image description here

虽然我相信这是由 SpeciesDetailViewController 被称为顶级 viewController 引起的,但我不知道如何解决这个问题。

你能帮我显示导航 Controller 和 tabBarController 吗?

以下是我当前的代码:

主视图 Controller

func showDetailsViewController() {

let topVC = topMostController()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "SpeciesDetailViewController") as! SpeciesDetailViewController
topVC.present(vc, animated: true, completion: nil)

}

func topMostController() -> UIViewController {
var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController!
while (topController.presentedViewController != nil) {
topController = topController.presentedViewController!
}

return topController
}

最佳答案

对于 UITabBarControllerUINavigationController 您需要不同的实现。

这是我用来获取 topMostViewController 的代码:

protocol TopUIViewController {
func topUIViewController() -> UIViewController?
}

extension UIWindow : TopUIViewController {
func topUIViewController() -> UIViewController? {
if let rootViewController = self.rootViewController {
return self.recursiveTopUIViewController(from: rootViewController)
}

return nil
}

private func recursiveTopUIViewController(from: UIViewController?) -> UIViewController? {
if let topVC = from?.topUIViewController() { return recursiveTopUIViewController(from: topVC) ?? from }
return from
}
}

extension UIViewController : TopUIViewController {
@objc open func topUIViewController() -> UIViewController? {
return self.presentedViewController
}
}

extension UINavigationController {
override open func topUIViewController() -> UIViewController? {
return self.visibleViewController
}
}

extension UITabBarController {
override open func topUIViewController() -> UIViewController? {
return self.selectedViewController ?? presentedViewController
}
}

现在,无论您拥有什么 UIViewController 堆栈,您都可以使用它从应用程序获取 topUIViewController,包括 UINavigationController、UITabBarViewController。

let topVC = UIApplication.shared.keyWindow!.rootViewController!.topUIViewController()

关于ios - 调用 rootViewController 后导航 Controller 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47489854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com