在 UIAlertView 上显示 UIActionSheet

Posted

技术标签:

【中文标题】在 UIAlertView 上显示 UIActionSheet【英文标题】:Showing UIActionSheet over UIAlertView 【发布时间】:2013-06-24 09:12:31 【问题描述】:

对于特定的服务器通知,我应该显示 UIActionSheet。但是这里的问题是,当该事件发生时,同时如果任何 UIAlertView 已经显示在任何视图控制器上,它会使 UIActionSheet 被禁用(在为警报视图按下确定后,我无法在视图控制器上选择任何内容,视图被禁用,因为UIActionSheet)。任何人都遇到过这种问题,知道如何解决吗?

我尝试在显示操作表之前关闭警报视图,但是我需要关闭哪个警报视图,因为我在许多控制器中有许多警报视图。所有这些都是该控制器的本地。如何解决这个问题。

注意: iPod 不会出现同样的问题,因为它不允许在响应 UIActionSheet 之前单击确定。

【问题讨论】:

【参考方案1】:

获取一个名为 activeAlertView 的全局警报视图。现在,当您显示警报视图时,请检查该警报视图,然后显示和分配。喜欢

在.h中声明一个属性并合成它

@property (nonatomic, retain) UIAlertView *activeAlertView;

然后在尝试显示警报时使用以下代码。

if(self.activeAlertView)
    [self.activeAlertView dismissWithClickedButtonIndex:0 animated:YES];

UIAlertView *localAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Your message" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil, nil ];
[localAlert show];
self.activeAlertView = localAlert;
[localAlert release];

这样,您的 activeAlertview 将保留当前警报视图的引用,并在显示 actionSheet 之前关闭警报视图。

【讨论】:

在您的子视图控制器中创建一个类似的全局警报视图,并使用相同的逻辑,例如如果有警报将其关闭,显示新警报并将其引用保留在全局变量中。重要的是,您可以访问子视图控制器的全局属性。 是的,这是我的最后一个选择...我一直在尝试任何其他可能性来处理此案...如果有任何感谢,我会更新。【参考方案2】:

对于确定哪个alert-view,您必须设置标签alert-view

例如:-

alertviewName.tag=1;

然后你可以检查是否有 alert-view Open in Particular view-controller sub-views 使用如下代码:-

- (BOOL) doesAlertViewExist 

        for (UIView* view in yuorviewcontroller.view.subviews) 
            BOOL alert = [view isKindOfClass:[UIAlertView class]];

            if (alert)
            
             return YES;
            

        
       return NO;


调用此方法后,您将获得 BOOL 值 YES 或 NO 如果是,则使用 UIAlertview 的委托将其关闭:-

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;

并将您的 Actionsheet 出现代码放入 didDismissWithButtonIndex 方法中。

【讨论】:

【参考方案3】:

当消息到来时,首先检查是否有警报视图。

在警报视图关闭后显示操作表。在didDismiss... 中,如果您现在必须显示操作表,您可以检查 BOOL 标志。

【讨论】:

是的,我明白了你的意思,但问题是我需要关闭哪个警报视图...父视图控制器正在接收服务器事件并且它也在显示操作表..但在那之前在任何子视图控制器中都可能显示警报视图.. 我怎么知道哪个警报视图以及如何关闭.. 我需要向所有孩子发送消息吗?【参考方案4】:

在这种情况下,你应该使用

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

方法而不是,

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

所以你的代码将是:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

if (buttonIndex == 0)

    UIActionSheet *actionSheet = ...
    [actionSheet showFromTabBar:self.tabBarController.tabBar];


谢谢

【讨论】:

它是一个来电通知...我迫不及待地点击 UIAlertview 的确定按钮,我需要通过给予高优先级来显示操作表。【参考方案5】:

试试这个: for (UIWindow* w in [UIApplication sharedApplication].windows) for (NSObject* obj in w.subviews) if ([obj isKindOfClass:[UIAlertView 类]]) [(UIAlertView*)obj dismissWithClickedButtonIndex:[(UIAlertView*)obj cancelButtonIndex] 动画:YES];

【讨论】:

以上是关于在 UIAlertView 上显示 UIActionSheet的主要内容,如果未能解决你的问题,请参考以下文章

如果显示 UIAlertView,iOS 上是不是有通知?

如何在 iOS 8 上显示没有按钮的 UIAlertView?

我想在 UIAlertView 上显示 UIProgressView

Xcode 在 UITableRowSelection 之后显示 UIAlertView?

UIAlertView 上面的 UIView

使用 UIAlertView 固定注解