2010-12-06 5 views
10

私のiOSアプリケーションでは、タイマーが起動しています。起動すると、アラート(UIAlertView)かアクションシート(UIActionSheet ) 開いた。iPhone:UIAlert/UIActionSheetが開いているかどうかを検出する

アラート/アクションシートを提示するコードを変更する方法もありますが、残念ながらこれは私の場合は選択肢ではありません。

アラートやアクションシートが開かれているかどうかを知る/検出する方法はありますか?

ビュー階層を開くときに通知が送信されるか、またはそれを検出するためにビュー階層がトラバースされますか?

おかげ

答えて

17

は彼らが開いたときにアラートを送信んが、唯一の彼らのdelegate - その問題へのすてきなアプローチをthis questionを確認してください。 Techzenでは、アラートを開くときにブール値フラグをYESに設定し、アラートを閉じるときにNOに戻すように設定することを推奨します。

EDIT:

あなたは、コードへのすべてのアクセスを持っていないので、このコードの不格好作品しようとしない理由:

-(BOOL) doesAlertViewExist { 
    for (UIWindow* window in [UIApplication sharedApplication].windows) { 
    NSArray* subviews = window.subviews; 
    if ([subviews count] > 0) { 

     BOOL alert = [[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]]; 
     BOOL action = [[subviews objectAtIndex:0] isKindOfClass:[UIActionSheet class]]; 

     if (alert || action) 
     return YES; 
    } 
    } 
    return NO; 
} 
+2

THANKSを行かなければなりませんでした!提案に2つの変更を加えなければなりませんでした:(1)NSArray *のサブビューで、UIView *ではありません。 (2)UIActionSheetが最初の[0]サブビューではなく、2番目の[1]のように見えます。だから私はビュー階層を反復した。コードは答えとして投稿されている... – Reuven

+0

私は、参考文献を保持するTechZenの他の提案を使用した。私はこれが非常にエレガントに働いていることを発見 –

+1

iOS 7でも動作しますか? –

12
- (BOOL) doesAlertViewExist { 
    for (UIWindow* window in [UIApplication sharedApplication].windows) { 
     for (UIView* view in window.subviews) { 
      BOOL alert = [view isKindOfClass:[UIAlertView class]]; 
      BOOL action = [view isKindOfClass:[UIActionSheet class]]; 
      if (alert || action) 
       return YES; 
     } 
    } 
    return NO; 
} 
+0

こんにちは私は同じ問題に直面していますが、私は上記のコードを試してみましたが、 "window.subviews"の配列を印刷しようとしましたが、uiactionsheetのオブジェクトを取得しませんでした。この上にいくつかの解決策を教えてください – user968597

+0

私はこのコードをiPhone上でのみ使用しました - それはあなたがiPadで使用しているかもしれませんか? – Reuven

+0

ipadで全く動作しません。 :( – Tarun

2

をあなたは、ビューのウィンドウを確認することができますプロパティ:

if(actionSheet.window) 
    isBeingPresented = YES; 
1

の助けをありがとう、しかしiOSの6以降、コード片はもう動作しません。 ただし、このコードで問題を修正しました。これが欲しいと思っています

for (UIWindow* window in [UIApplication sharedApplication].windows) { 
    NSArray* subviews = window.subviews; 
    if ([subviews count] > 1) { 
     BOOL alert = [[subviews objectAtIndex:1] isKindOfClass:[UIAlertView class]]; 
     BOOL action = [[subviews objectAtIndex:1] isKindOfClass:[UIActionSheet class]]; 

     if (alert || action) 
      return YES; 
    } 
} 
return NO; 
2

アラートの検出は比較的簡単ですが、アクションシートが私を困惑させました。 iOSの6.1では、私はさらに一歩

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

}

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

}

+0

iOS 7では、このコードはアクションシートで動作しますが、アラートビューでは機能しなくなりました。アラートビューに最適なソリューションのようです。http://stackoverflow.com/q/18702565/268153 –

1
-(BOOL)GetKeyWindow {  
     UIViewController *presentedViewController = myAppDelegate.window.rootViewController.presentedViewController; 

     if (presentedViewController) { 

      if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {   

       return YES; 
      }else{ 
       return NO; 
       NSLog(@"not present"); 
      } 
     } 
     else{ 
      return NO; 
     } 
} 
関連する問題