2

私のアプリケーションでは、ユーザーに「やり直し」をクリックするオプションを与えずに、プログラムで元に戻したいアクションがいくつかあります。のやり直しスタックをクリアする方法はありますNSUndoManagerか? そうでない場合、サブクラス化NSUndoManagerする必要があった場合、再実行スタックをクリアするためにアクセスする方法はありますか? ドキュメントからの方法がわかりませんでした。

または、現在のネストされた取り消しグループからの変更を、やり直しスタックに取り込まずに元に戻す方法はありますか? ネストされた元に戻すグループを既に構築しています。

4

2 に答える 2

4

私は最終的に2段階のアプローチを取りました。最初のステップは、やり直しスタックをクリアするダミーの元に戻す項目を作成することでした。次に、その元に戻すアイテムを削除するだけで、両方のスタックがクリーンになりました。

selfコードを含むクラスに関連付けられた実際の元に戻すアクションがないため、ダミーの元に戻すターゲットとして使用できました。self元に戻すスタックに寄与しない任意のオブジェクトに置き換えることができます。

トリックはremoveAllActionsWithTarget遅延で呼び出すことでした。それ以外の場合は効果がありません。

// End the open undo grouping
[undoManager endUndoGrouping];

// Perform the undo operation, which gets pushed onto the Redo stack
[undoManager undo];

// Add a dummy Undo item to clear the Redo stack
[undoManager registerUndoWithTarget:self selector:nil object:nil];

// Remove the dummy item with a delay, pushing it to the next run loop cycle
[undoManager performSelector:@selector(removeAllActionsWithTarget:)
                  withObject:self
                  afterDelay:0.0];
于 2011-04-19T12:46:57.960 に答える
2
[undoManager disableUndoRegistration];
[undoManager undo];
[undoManager enableUndoRegistration];
于 2011-04-17T21:03:39.843 に答える