这是一个插入类别UIPopoverController
,可以满足您的要求。
基本上,类别 swizzlesinitWithContentViewController:
以便它可以跟踪UIPopoverController
a 中的活动实例NSHashTable
(它本身并不保持包含的 UIPopoverControllers 活动,因为它保持对它们的弱引用。)它还监视UIApplicationDidEnterBackgroundNotification
,并且当它到达时它迭代活动 UIPopoverControllers 的集合和驳回任何正在显示的内容。
扩展它以实现 Apple 的“不允许同时显示两个弹出窗口”规则可能会很好。
我不是生产应用程序中方法调配的忠实粉丝,但这似乎很安全。
没有特别的使用说明。只需在您的项目中包含该类别并正常使用您的 UIPopoverControllers。
#import <objc/runtime.h>
@interface UIPopoverController (autodismiss)
@end
@implementation UIPopoverController (autodismiss)
static NSHashTable* ts_popoverHashTable;
+ (void) load
{
SEL originalSelector = @selector(initWithContentViewController:);
SEL replacementSelector = @selector(ts_initWithContentViewController:);
Method originalMethod = class_getInstanceMethod( [UIPopoverController class], originalSelector);
Method replacementMethod = class_getInstanceMethod( [UIPopoverController class], replacementSelector);
method_exchangeImplementations(originalMethod, replacementMethod);
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector( applicationDidEnterBackgroundNotification: )
name: UIApplicationDidEnterBackgroundNotification
object: nil];
}
- (id) ts_initWithContentViewController: (UIViewController*) contentViewController
{
UIPopoverController* pc = [self ts_initWithContentViewController: contentViewController];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ts_popoverHashTable = [NSHashTable weakObjectsHashTable];
});
[ts_popoverHashTable addObject: pc];
return pc;
}
+ (void) applicationDidEnterBackgroundNotification: (NSNotification*) n
{
for ( UIPopoverController* pc in ts_popoverHashTable )
{
if ( pc.isPopoverVisible )
{
[pc dismissPopoverAnimated: NO];
}
}
}
@end