如何解除UIActionSheets和UIPopoverControllers而不知道是谁出示的

在我的客户端应用程序中,我有一个空闲的超时控制机制,当用户在指定的时间间隔内没有对应用程序执行任何操作时,我会显示一条警告并将其返回到login屏幕。 这个控制发生在我的容器视图中,我启动了我所有的其他视图。 当空闲时间到了,我popup这个容器视图到它的调用者,即login屏幕。

问题是,如果用户确实显示一个动作表或一个popup窗口,然后在空闲时间到来之前什么都不做,当我把他扔到login屏幕时,动作表和popup窗口仍然保留在login屏幕上因为我不排除他们。

为了解决这个问题,我可以考虑把所有的动作表和popup窗口保留在我的视图控制器中,然后在其所有者的viewWillDisappear方法上解除它们。 但是我有这么多的视图控制器,所以我正在寻找其他方式,如果有的话。

所以,问题是我怎样才能使所有这些行动表和popup窗口远离我的login屏幕,而不知道谁是他们的来电者?

我将注册UIPopover实例来侦听某个通知。

[[NSNotificationCenter defaultCenter] addObserver:_myPopOver selector:@selector(myDismissPopover) name:@"dismissPopover" object:nil]; 

并添加扩展到UIPopover类。

 - (void) myDismissPopover { [self dismissPopoverAnimated:YES]; } 

当我需要closurespopover时,我只需要发布通知。

 [[NSNotificationCenter defaultCenter] postNotificationName:@"dismissPopover" object:nil]; 

我会写下我自己的解决scheme,因为我们已经在问题的评论中与bshirley谈过了。 我已经实现了这样一个机制来解决这个问题:

在我的login视图控制器中,我创build了一个NSMutableArray,它将保留将要被解雇的所有动作表和popup控制器。 然后我将这个数组存储在全局字典中。 我通过实用的方法访问这个字典。 然后,通过应用程序,创build操作表或popup窗口控制器的任何人,都会将组件添加到此数组(从全局数据中检索数组,然后将其修改并保存回全局数据)。 然后,当用户被抛回到login屏幕,viewWillDisappear我的login视图控制器,我循环这个数组,并通过检查是否从数组中获得的UIView是一个行动表或一个popup窗口控制器调用适当的解雇方法。 然后我删除该数组的所有元素,然后再将其存储在全局数据中。

希望这有助于任何需要实施类似机制的人。 您的意见将不胜感激。