在许多应用程序中,我写过多次,我必须从某个类中提供模态控制器,而我没有引用当前可见的控制器。 (例如,提供用于显示产品下载进度的控制器的StoreKit事务观察器。)
使用Three20,我可以使用- [TTNavigator visibleViewController]
来完成工作,但如果我不想使用框架怎么办?我应该重新实现像TTNavigator
这样的自定义函数吗? Apple API中是否有类似的方法?例如,为我的应用程序中的所有控制器创建一个公共父类,然后使用NSNotificationCenter
来处理所有应用程序范围的通知会更好吗? (这当然会产生在一个类中包含不相关代码的副作用)
我真的很惊讶Apple没有在他的标准API中提供这个基本功能。或者可能是这个问题再次发生在我身上,这表明设计实践很差?
答案 0 :(得分:1)
一些想法,不一定保证是正确的,但也许会让你朝着正确的方向前进:如果我理解你的问题,基本上你有一些具体的行动,在某些时候(比如完成时)需要显示一个模态查看,但是所述操作没有对当前在屏幕上的视图控制器的引用(例如,您可能正在后台执行任务并让用户仍在您的程序中导航,并且想要提醒用户完成时。)
我想您将如何解决这个问题取决于您的应用程序的整体架构。大多数应用程序都有一些控制导航的根视图控制器:也许你有一个{app}委托创建的UITabBarController
,并且所有导航都从该控制器中脱离。您可以通过此顶级视图控制器显示模态视图控制器(您可能在应用程序委托中执行此操作)。
或者,您可以放弃显示模态视图控制器的想法,并将视图直接附加到应用程序窗口。如果您查看一个相当受欢迎的库,例如MBProgressHUD
,您会看到您可以将提供的模态加载视图附加到应用程序窗口,所有视图控制器都位于该窗口中。
因此,有许多不同的策略可以实现您的目标。我不一定会说你的问题是应用程序设计不佳的结果,因为有些情况下你可能需要显示一些模态对话框而不知道当前可见的视图控制器。也就是说,在您提供的示例中 - 显示下载进度的StoreKit事务观察器 - 可以假设它将在离散操作(例如,购买产品)之后触发,并且您将知道从哪个视图控制器触发了