如何检查UIViewController是否已经显示?

时间:2019-04-02 03:47:51

标签: swift uiviewcontroller

我正在开发一个显示今日扩展并包含一些信息的应用。当我点击Today扩展程序时,它将打开应用程序并从根导航到子视图以显示信息。通常,用户随后会单击后退箭头以返回到主视图,但是无法判断这是否确实完成。用户可以返回今天的扩展名,然后再次点击。完成此操作后,将使用新信息再次打开子视图。如果这样做了很多次,那么我最终会得到一堆子视图实例,并且必须单击每个子视图上的“后退”按钮以返回主视图。

我的问题:是否可以检查子视图是否已经可见?我希望能够向其发送更新的信息,而不必显示全新的视图。

我目前正在通过将UIViewController实例保留在根目录的顶部来处理此问题。如果不是零,那么我将信息传递给它并重绘。如果为零,那么我叫performSegue并创建一个新的。

我只是认为必须有一种更好的方法来处理此问题。

编辑:由于下面的注释器,我想出了这段代码,似乎可以满足我的需要。

        if let quoteView = self.navigationController?.topViewController as? ShowQuoteVC {
            quoteView.updateQuoteInformation(usingQuote: QuoteService.instance.getQuote(byQuoteNumber: quote))
        }
        else {
            performSegue(withIdentifier: "showQuote", sender: quote)
        }

这与建议的答案不同:

if (self.navigationController.topViewController == self) {
    //the view is currently displayed
}

在这种情况下,它没有用,因为当我从Today Extension进入应用程序时,它进入了根视图控制器。我需要检查是否正在显示子视图,并且self.navigationController.topViewcontroller == self永远无法工作,因为我没有检查顶部视图控制器是否是根视图控制器。这篇文章中的建议更适用于我要完成的工作。

1 个答案:

答案 0 :(得分:0)

u可以使用此扩展名来检查通过UIApplication UIViewController当前显示的内容:

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

和用法示例:

 if let topController =  UIApplication.topViewController() {
        if !topController.isKind(of: MainViewController.self) { //MainViewController- the controller u wish to equal its type
            // do action...
        }
    }