我正在开发一个显示今日扩展并包含一些信息的应用。当我点击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永远无法工作,因为我没有检查顶部视图控制器是否是根视图控制器。这篇文章中的建议更适用于我要完成的工作。
答案 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...
}
}