2011-04-20 71 views
0

在很多应用程序中,我写了很多次,我不得不从某些类没有参考当前可见控制器的模态中呈现控制器。 (例如,呈现用于显示产品的下载进度的控制器的StoreKit交易观察者)。什么是从任何地方呈现UIViewController的推荐方式?

With Three20,我可以使用- [TTNavigator visibleViewController]来完成工作,但如果我不想使用框架呢?我应该重新实现一个像TTNavigator那样的自定义函数吗? Apple API中可能有类似的方法吗?例如,为我的应用程序中的所有控制器创建一个通用的父类,然后使用NSNotificationCenter来处理所有应用程序范围内的通知,会更好吗? (这当然会有在一个类中具有不相关代码的副作用)

我真的很惊讶苹果没有在他的标准API中提供这个基本功能。或者,这个问题对我来说反复出现的事实是一个糟糕的设计实践的迹象?

回答

1

一些想法,不一定保证是正确的,但也许会让你朝正确的方向发展:如果我正确地理解你的问题,基本上你有一些具体的行动,在某些时候(比如完成时)需要显示一个模式视图,但是所述操作没有对当前在屏幕上的视图控制器的引用(例如,也许你正在后台执行任务,并让用户仍然浏览您的程序,并且要提醒用户完成)。

我想你将如何解决这个问题将取决于你的应用程序的整体架构。大多数应用程序都会有一些控制导航的根视图控制器:或许您已在应用程序委托中创建了UITabBarController,并且所有导航都从该控制器中脱离出来。你可以通过这个顶层的视图控制器显示你的模式视图控制器(你可能会在你的应用程序委托中这样做)。

或者,您可以放弃显示模式视图控制器的想法,并将视图直接附加到您的应用程序窗口。如果你看看一个相当受欢迎的图书馆,如MBProgressHUD,你会看到你可以附加提供给应用程序窗口的模态加载视图,其中所有视图控制器都位于该窗口中。

所以有很多不同的策略来实现你想要的。我不一定会说你的问题是一个糟糕的应用程序设计的结果,因为有些情况下你可能想要显示一些模式对话框而不知道当前可见的视图控制器。也就是说,在您给出的例子中 - 一个显示下载进度的StoreKit事务观察器 - 人们会认为它会在离散操作(例如购买产品)后触发,并且您会知道从哪个视图控制器触发。

+0

谢谢你的详细解答。在App Delegate中,我确实有一个对根视图控制器的引用(通过主窗口)。但是它仍然不能让我立即获得当前可见的控制器,因为目前可能存在模态控制器,导航堆栈可能更复杂。至于我给出的例子,现在我按照你所说的处理问题:虽然苹果不赞成这样做,但我将商店控制器设置为交易的观察者,因为应用程序完成启动后应尽快处理未完成的事务。 – eugeniodepalo 2011-04-20 10:11:24

+0

嗯,好的 - 我没有考虑过你已经显示模态控制器的可能性(即模态内的模态)。如果是这种情况,最简单的方法可能就是覆盖窗口并将其转储到整个应用程序视图层次结构的顶部。 – lxt 2011-04-20 11:27:53

相关问题