如何解雇我没有引用的UIPopoverControllers?

时间:2011-03-07 09:26:17

标签: iphone objective-c ios ipad

我的工具栏中有很多BarButton,我想为每个BarButtons显示不同的UIPopoverController。当我点击其中一个时,应该关闭其他PopoverControllers(即屏幕上只显示一个popovercontroller)。我不想继续引用它们 - 因为这太烦人了。还有另一种方法可以解雇他们吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我知道没有“解雇所有弹出窗口”的功能。

但要解决这个问题,你不必继续引用所有不同的popovers;仅保留对当前显示的弹出窗口的引用。然后,当启动新的弹出窗口时,您可以忽略当前显示弹出窗口(如果它不是nil)。然后将“当前显示弹出窗口”分配给您显示的新弹出窗口。

答案 1 :(得分:1)

使用自动化测试框架KIF让我想到了他们的dismissPopovers功能。

我稍微修改了这个函数,所以你真的可以使用全局解除所有popovers函数。 这是代码:

    //dismiss popovers
    NSArray *windows = [[UIApplication sharedApplication] windows];
    for(UIView *currentPopover in [[windows objectAtIndex:0] subviewsWithClassNamePrefix:@"UIDimmingView"]) {
       [currentPopover removeFromSuperview];
    }

和UIViewExtension:

- (NSArray *)subviewsWithClassNamePrefix:(NSString *)prefix;
{
    NSMutableArray *result = [NSMutableArray array];

    // Breadth-first population of matching subviews
    // First traverse the next level of subviews, adding matches.
    for (UIView *view in self.subviews) {
        if ([NSStringFromClass([view class]) hasPrefix:prefix]) {
            [result addObject:view];
        }
    }

    // Now traverse the subviews of the subviews, adding matches.
    for (UIView *view in self.subviews) {
        NSArray *matchingSubviews = [view subviewsWithClassNamePrefix:prefix];
        [result addObjectsFromArray:matchingSubviews];
    }

    return result;

}

感谢KIF提示

答案 2 :(得分:0)

根据来自 here 的开发者文档,弹出窗口内容之外的选项会自动关闭弹出窗口。但是您可以使用此方法dismissPopoverAnimated以编程方式关闭弹出框以响应弹出窗口内的点击。例如,您可以在didFinishPickingMediaWithInfo UIImagePickerController

的委托中将其删除

希望你明白......祝你好运!