私は編集で提案したことをやり遂げました。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;
}
をしながら、タイマーが解雇場合、我々は、アンドゥが実現するかのどちらかアラートが表示され、アラートがキャンセルされた場合、取り消し可能な操作をクリアします。それ以外の場合は、取り消し後に取り消しアクションがキャンセルされます。
これが誰かを助けることを願っています!
私はmotionEnded:withEventメソッドを使用して行くと思います。 UIAlertViewは基本的にUIWindowです。主アプリのウィンドウが再びキーになったときにチェックして、元に戻すアラートビューが解除されたことを知ることができます。 –
うーん、良い点。私はmotionEnded事と一緒に行くと思う。それがうまくいくなら私はここで答えてくれるでしょう。ありがとう! – kevboh