2011-08-17 18 views
7

iOSでMPMoviePlayerControllerを使用しています。私はビデオを再生中に発生する可能性のあるエラーを聞いています。私のエラーハンドラでは、私はUIAlertViewをポップアップします。時にはエラーが互いに連続して起こり、複数のアラートボックスが積み重なることがあります。より良いユーザーエクスペリエンスのために、以前のものがまだ表示されている場合は、別のアラートをポップアップ表示しないことをおすすめします。複数のUIAlertViewが積み重なるのを防ぐにはどうすればいいですか?

答えて

5

はこれを試してください:あなたは警告をポップアップ表示するとき

trueにブール値を設定し、アラートを閉じたときfalseにそれを設定し、常にあなたがイベントをポップアップする前に、それはtrueだかどうかを確認するためにブール値をチェックしてください。 trueの場合は、すでに表示されている警告ウィンドウが表示されます。

You can find this solution and some other discussion here

+0

を絶対にありません。あなたが貼り付けたコードは、SPIを使用するのと同じくらい悪いですが、おそらくあなたが拒否されることはありませんが(あなたが行っているようなサブビューを見つけるのは難しいので)、それは正当に*あなたがアプリから拒否されるべきものです格納。また、UIAlertViewがどのように動作し、OSアップデートで破損する可能性があるかについても仮定しています。 –

+0

ありがとう、私は私の答えのその部分を削除しました。 – mopsled

1

あなたはこれを自明に実装できます。アラートを表示しているので、アラートの代理人でもあるので、アラートが表示されたときにブール値フラグを設定するだけで、アラートが表示されているかどうかを簡単に追跡できます。このようにしてブール値が設定されている場合は、それ以降のアラートを取り消すことができます。

+0

時にはシステムアラートがポップアップし、奇妙な動作を引き起こすことがあります: – powerj1984

0

私が知る限り、唯一の方法は、アラートが現在表示されているかどうか、および/または現在アプリケーション内で却下されているかどうかを追跡することです。 appDelegateでアラートを表示してから、アラートが閉じられるたびに通知を使用してappDelegateに通知してください。このようにして、appDelegateはbooleanフラグ変数を持つ警告があるかどうかを追跡します。

1

アラートが表示されると_UIAlertOverlayWindowに移動します。したがって、かなり壊れやすい方法は、すべてのウィンドウを繰り返し、UIAlertViewサブビューがあるかどうかを確認することです。

-(BOOL)checkAlertViewVisibleStatus 
{ 
    for (UIWindow* window in [UIApplication sharedApplication].windows) 
    { 
    NSArray* subviews = window.subviews; 
     if ([subviews count] > 0) 
     if ([[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]]) 
      return YES; 
    } 
return NO; 
} 

これは、Appleがこれについて不平を言うことはできませんが、内部の表示階層に依存しているため、これは文書化されていません。より信頼性が、さらに多くの文書化されていない方法は `

[_UIAlertManager visibleAlert]

` nilであるかどうかを確認することです。

これらのメソッドは、SpringBoardからのUIAlertViewが表示されているかどうかを確認できません。

0

新しいUIAlertViewControllerを使用してください。別のビューが表示されている間にアラートを表示しようとすると、それを無視して次の警告が出力されます。積み重ねられたアラートの伝統的な振る舞いを欲しがっている人にとっては厄介な副作用ですが、あなたのケースでは良い解決策です。

Warning: Attempt to present <UIAlertController: 0x7f9ef34c17e0> on <MasterViewController: 0x7f9ef344ec90> which is already presenting (null) 
0

それは動作するはずです:

-(BOOL) doesAlertViewExist 
{ 
    if ([[UIApplication sharedApplication].keyWindow isMemberOfClass:[UIWindow class]]) 
    { 
     return NO;//AlertView does not exist on current window 
    } 
    return YES;//AlertView exist on current window 
} 
関連する問題