在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 8 上显示没有按钮的 UIAlertView?
我想在 UIAlertView 上显示 UIProgressView