2012-01-29 8 views
2

私は一般的に(より良い方法がある場合)、次に私が遭遇した障害ブロックを説明しようとします(私の方法が最高の場合方法)。NSUndoManagerのアラートビューが表示されていることを検出するとき

私がしたいこと:時間制限のある元に戻すマネージャに呼び出しを追加したいとします。時間制限内でアンドゥがトリガされないと、デバイスが振られたときにアンドゥが利用できなくなり、何も起こりません。

私がやっていること:私のアプローチはNSUndoManagerNSTimerとしました。 UNDOマネージャーに呼び出しを追加すると、5秒タイマーも起動します。タイマーが起動すると、!self.undoManager.isUndoingがチェックされ、それが真であれば、アンドゥマネージャからすべてのアクションが削除されます。シミュレーターでテストすると、5秒前に振るジェスチャーで元に戻すことができます。

問題は、ユーザーが実際に元に戻す]ボタンをタップする5秒の制限の後までを待っている場合、何も起こりません、私は5秒の制限の下でシェイクジェスチャーを取得する場合、アンドゥマネージャは、アラートが表示されていることですが、:アラートビューが表示されていても、タイマーはスタックを空にクリアしました。

アラートビューが表示されているかどうかを確認する方法はありますか?ユーザーが元に戻すかキャンセルするかを把握し、キャンセルボタンが押された場合は元に戻すマネージャのアクションスタックをクリアするのがベストでしょう。

この方法でタイマーを使用する以外にも、より良い方法がありますか?

ありがとうございます!

を追加する編集:私の他の考えは(motionEnded:withEvent:呼び出しを介して)手ブレイベントを自分自身をキャプチャし、手動でアラートを管理し、スタックを元に戻すことでした。上記と比較した考えも大歓迎です。

+1

私はmotionEnded:withEventメソッドを使用して行くと思います。 UIAlertViewは基本的にUIWindowです。主アプリのウィンドウが再びキーになったときにチェックして、元に戻すアラートビューが解除されたことを知ることができます。 –

+0

うーん、良い点。私はmotionEnded事と一緒に行くと思う。それがうまくいくなら私はここで答えてくれるでしょう。ありがとう! – kevboh

答えて

0

私は編集で提案したことをやり遂げました。motionEnded:withEventを使用してアラートを手動で管理して元に戻しました。これの欠点は、UIAlertViewとはわずかに異なるスタイルを持つ組み込みの元に戻す警告を取得せず、画面を揺れ動かして入力することです。

私は現在、10秒後に失効する元に戻すことができます。以下は、同じコードを必要とする場合のコードの一般的な構造です。

まず、make sure your app can receive shake eventsとあなたはNSUndoManagerにアクセスできます。タイマーも必要です。元に戻すことができるイベントが発生したときに起動して10秒間続くコードをNSTimerに設定しています。あなたの元に戻すターゲットを同じタイマーに追加して、実際に元に戻すものがあるようにしてください。

次に、そのようmotionEnded:withEventを実装:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    if (motion == UIEventSubtypeMotionShake && [self.undoManager canUndo]) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Undo something?" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Undo", nil]; 
     [alert show]; 
     undoAlertIsVisible_= YES; 
    } 
} 

私は私の警告が画面に表示されている場合を追跡するためにここにundoAlertIsVisible_と呼ばれるIVARを使用しています。我々は現在、取り消していないと警告が表示されていないかを確認ここで

if (!self.undoManager.isUndoing && !undoAlertIsVisible_) { 
    // Clear away the possible undo 
    [self.undoManager removeAllActionsWithTarget:self]; 
} 
undoTimer_ = nil; 

:あなたのタイマーのコールバックで

は、ような何かを行います。その場合は、元に戻すアクションを削除し、タイマー(別のivar)をnilに設定します。私はそれがここにある私の警告コールバック、中に解雇だかどうかを確認することができるように、私はnilにタイマーを設定しています:警告コールバックで

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex != alertView.cancelButtonIndex) { 
     if (self.undoManager.canUndo) { 
      [self.undoManager undo]; 
     } 
    } 
    else { 
     if (!undoTimer_) { 
      // Timer fired while we were staring at the alert 
      [self.undoManager removeAllActionsWithTarget:self]; 
     } 
    } 
    undoAlertIsVisible_= NO; 
} 

をしながら、タイマーが解雇場合、我々は、アンドゥが実現するかのどちらかアラートが表示され、アラートがキャンセルされた場合、取り消し可能な操作をクリアします。それ以外の場合は、取り消し後に取り消しアクションがキャンセルされます。

これが誰かを助けることを願っています!

関連する問題