2014-01-17 14 views
6

iOSアプリケーションのどの部分でも、現在表示されているUIAlertViewが確認できますか?私はこのコード現在表示されているUIAlertViewが確認できますか?

[NSClassFromString(@"_UIAlertManager") performSelector:@selector(topMostAlert)] 

を見つけたが、それはプライベートAPIであると私のアプリは、Appleが拒否される可能性があります。 法的にこれを行う方法はありますか?

+0

チェックこの質問:[リンク](http://stackoverflow.com/q/10727957/2298998) –

+0

それはプライベートなAPIですが、どこかに私はperformselectorを使用すると、Appleの静的コード分析とOKであることを読みました。しかし、あなたは二重にする必要があります。 –

答えて

7

以下のiOS 7よりもデバイスの場合: -

あなたがUIAlertViewの体を作るときは、[alertView Show]は、メインウィンドウのサブビューを追加します。したがって、UIAlertViewを検出するには、UIViewのサブビューを確認するだけです。UIAlertViewUIViewから継承されます。

for (UIWindow* window in [UIApplication sharedApplication].windows){ 
    for (UIView *subView in [window subviews]){ 
     if ([subView isKindOfClass:[UIAlertView class]]) { 
      NSLog(@"AlertView is Present"); 
     }else { 
      NSLog(@"AlertView Not Available"); 
     } 
    } 
} 

EDIT: - iOSの7

Class UIAlertManager = objc_getClass("_UIAlertManager"); 
UIAlertView *Alert = [UIAlertManager performSelector:@selector(Alert)]; 

UIAlertView *Alert = [NSClassFromString(@"_UIAlertManager") performSelector:@selector(Alert)]; 

NOTE使用してデバイスの場合: -をあなたがサードパーティのAPIの、あなたの唯一の現実的な選択肢を使用できない場合iOS7はアラートビューを実際に追跡することです。

+0

ありがとうございます。ブルートフォース、しかしそれは働いている。 – Padavan

+0

あなたはそれを試しましたか?私はちょうど今試して、それは動作しません。常に "AlertViewは使用できません"。 – Padavan

+0

ios7デバイスでは動作しません。 ios7デバイスでは、キーウィンドウが使用されているためです。 –

1

このように確認できます。

-(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; 
} 
+0

このソリューションは、iOS 7以降では動作しません。 iOS 7以降の方法はありますか? –

関連する問題