解散原生UIActionsheet& iPad中的UIPopover

时间:2013-09-30 15:37:54

标签: ios ipad uitextview uiactionsheet uipopover

此问题涉及在iPad的webview / textview中选择电话号码或电子邮件时显示操作表和弹出窗口的本机iOS功能。如果您需要复习,操作表包含两个按钮,分别为“添加到联系人”和“复制”。我所指的弹出框是用户选择“添加到联系人”按钮时显示的内容。

我明白要解雇一个popover声明:

[somePopoverController dismissPopoverAnimated:YES];

要关闭动作表,可以简单地调用:

[someActionSheet dismissWithClickedButtonIndex:0 animated:YES];

然而,我的问题是,由于iOS为我创建了这些操作表/弹出窗口,我不拥有它们,也无法引用它们来调用dismiss方法。

我需要这样做的用例是因为我的应用程序会在指定的无活动时间后将用户注销。当用户注销时,这些操作表/弹出窗口仍保留在屏幕上,即使我已输入新的视图控制器并删除旧的视图控制器。

有谁知道我如何引用我不拥有的这些弹出窗口和操作表?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

好吧,我找到了解决UIActionSheets和在iPad上检测电话号码/电子邮件时从Webviews / Textviews创建的popover的解决方案。解决方案基本上是使用递归迭代我的所有视图,直到找到我想要忽略的视图。很多功劳都要归功于我在这篇文章Accessing UIPopoverController for UIActionSheet on iPad中找到的答案。

删除UIActionSheets:

BOOL IsActionOpen(UIView* aView) {
    BOOL    actionOpen = NO;
    if (aView) {
        if ([aView isKindOfClass:[UIActionSheet class]]) {
            actionOpen = YES;
            [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO];
        }
        else if (aView.subviews.count > 0) {
            for (UIView* aSubview in aView.subviews) {
                if ( IsActionOpen( aSubview)) {
                    if ([aView isKindOfClass:[UIActionSheet class]]) {
                        actionOpen = YES;
                        [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO];
                    }break;
                }
            }
        }
    }
    return actionOpen;
}

- (void) removeActionSheetIfShowing {
    BOOL    actionOpen = NO;
    for (UIWindow* w in [UIApplication sharedApplication].windows) {
        actionOpen =  IsActionOpen(w);
        if (actionOpen)
            break;
    }
}

要从生成的UIActionSheet中选择“添加到联系人”按钮时删除创建的弹出窗口:

BOOL IsPopOverOpen(UIView* aView) {
    BOOL    popOverOpen = NO;
    if (aView) {
        //popover is a popoverview, not a popovercontroller. We find it by checking if UIPopoverBackgroundView exists
        if([aView isKindOfClass:[UIPopoverBackgroundView class]]){
            popOverOpen = YES;
            [aView.superview removeFromSuperview];
        }
        else if (aView.subviews.count > 0) {
            for (UIView* aSubview in aView.subviews) {
                if ( IsPopOverOpen( aSubview)) {
                    if([aView isKindOfClass:[UIPopoverBackgroundView class]]){
                        popOverOpen = YES;
                        [aView.superview removeFromSuperview];
                    }break;
                }
            }
        }
    }
    return popOverOpen;
}

- (void) removePopOverIfShowing {
    BOOL    popOverOpen = NO;
    for (UIWindow* w in [UIApplication sharedApplication].windows) {
        popOverOpen =  IsPopOverOpen(w);
        if (popOverOpen)
            break;
    }
}

答案 1 :(得分:0)

您只需在视图控制器中保留对它们的引用即可。 例如,当您创建UIActionSheet时,只需将其存储在UIActionSheet

类型的属性中
@property (strong, nonatomic) UIActionSheet *myActionSheet;

然后,当您实际创建动作表时,执行

self.myActionSheet = [[UIActionSheet alloc] initWithTitle:myTitle 
                                                 delegate:self 
                                        cancelButtonTitle:cancelButtonTitle 
                                   destructiveButtonTitle:destButtonTitle 
                                        otherButtonTitles:otherButtonTitle, nil];

[self.myActionSheet showFromBarButtonItem:sender animated:YES];

当你需要解雇时,你只需要

[self.myActionSheet dismissWithClickedButtonIndex:0 animated:YES];