0

在我编写的许多应用程序中,多次出现我必须以模态方式从某个没有引用当前可见控制器的类中呈现控制器。(例如,一个 StoreKit 事务观察器,它提供一个用于显示产品下载进度的控制器)。

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

我真的很惊讶 Apple 没有在他的标准 API 中提供这个基本功能。或者这个问题在我身上反复出现的事实可能是设计实践不佳的标志?

4

1 回答 1

1

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

我猜你将如何解决这个问题将取决于你的应用程序的整体架构。大多数应用程序都会有一些控制导航的根视图控制器:也许您UITabBarController在应用程序委托中创建了一个,并且所有导航都来自该控制器。您可以通过这个顶级视图控制器显示您的模态视图控制器(您可能会在您的应用程序委托中执行此操作)。

或者,您可以放弃显示模式视图控制器的想法,并将视图直接附加到您的应用程序窗口。如果您查看一个相当流行的库,例如MBProgressHUD您会看到您可以将提供的模式加载视图附加到应用程序窗口,您的所有视图控制器都位于其中。

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

于 2011-04-20T09:33:44.723 回答