アンドゥマネージャ
アンドゥマネージャは、フレームワークオブジェクトであり、オブジェクトの状態の変更を記録し、後でユーザーの要求に応じてそれらの変更を元に戻します。NSUndoManager クラスのインスタンスであるアンドゥマネージャは、アンドゥ操作とやり直し操作の両方の管理をしています。アンドゥ操作は、オブジェクトのプロパティへの変更を元に戻します:アンドゥ操作が行われた場合は、アンドゥ操作は、元の値を復元します。アンドゥ(取り消し) を実行し、操作をやり直す機能は、アプリケーションの、ユーザーが広範囲にデータを変更できるようにする、特に他と異なる機能です。
UIResponder(UIKit フレームワーク) の undoManager プロパティを介して、または(AppKit フレームワークの) NSResponder の undoManager メソッドを呼び出して、アンドゥマネージャを取得できます。特定のコンテキストのためのプライベートなものを作成することもできますが、アプリケーションのすべてのウィンドウには、デフォルトのアンドゥマネージャが用意されています。
アンドゥとやり直しの操作は変更オブジェクトにメッセージ
アンドゥマネージャにアンドゥ操作を登録しなければなりません。アンドゥ・マネージャが操作を実行する場合には、登録時に供給されるいくつかの成分から構成されたメッセージを送信します。
- メッセージを受信するオブジェクト。受信するオブジェクトは、通常、値が変更されたプロパティーを持つオブジェクトです。
- 呼び出すメソッドのシグネチャ。署名は、多くの場合、セッターアクセサメソッドを識別します。
- メッセージの引数。引数は、通常、変更されたプロパティの、以前の値です。アンドゥ操作の場合、引数は変更された値です。
アンドゥマネージャは、アプリケーションのメインイベントループなどの実行ループの単一サイクル内で発生したすべてのアンドゥ操作を集めます;アンドゥ操作を実行すると、サイクル中に発生したすべての変更をを元に戻します。アンドゥ操作を実行する場合は、アンドゥマネージャは、ユーザーが元に戻せるように、アンドゥされた操作を保存します。
アンドゥとやり直し操作はスタックに置かれる
アンドゥマネージャは、ファーストイン・ラストアウトのスタック上に、アンドゥとやり直しの操作を保存します。アプリケーションが最初にアンドゥ操作を登録すると、アンドゥ·マネージャは、アンドゥ・スタックに追加します。しかし、ユーザーがアンドゥ操作を要求するまでアンドゥスタックは、空のままです。それが起こるとき、アンドゥマネージャは、変更を元に戻す1つ以上のメッセージを作成·送信するためにアンドゥスタックに対する最上位の操作グループを使用します。
これらの操作は、再び1つ以上のオブジェクトの状態の変化を引き起こすので、オブジェクトはアンドゥマネージャと、元の操作から逆方向にこの時は新しい操作を登録します。アンドゥマネージャは、変更を現在取り消すので、アンドゥスタック上のアンドゥ操作としてこれらの操作を記録します。その後のアンドゥ操作は、アンドゥスタックから動作を引っぱて来てオブジェクトに適用し、アンドゥスタック上にそれらを置き直します。オブジェクトの状態への新しい変更は前の変更を無効にするので、新しいアンドゥ操作が登録されるが早いか、アンドゥ·マネージャは、アンドゥスタックをクリアします。
操作はアンドゥグループに合体されています
アンドゥマネージャは、アンドゥとやり直しの、完全に回復可能なアクションを表現するグループでの操作を収集します。グループは、典型的には、何らかの形で関連するプロパティを識別します。これは、アンドゥのとやり直しのスタック上に、項目などの操作のこれらのグループを格納します。ですが、単一のアクションでも、グループとしてパッケージ化する必要があります。NSUndoManager は、通常は実行ループのサイクル中に自動的にアンドゥグループを作成します。それがサイクルでアンドゥ操作を記録するように頼まれて初めて、新しいグループを作ります。次いで、サイクルの終わりに、グループを閉じます。追加の、ネストされたアンドゥグループを作成できます。
アンドゥとやり直しを要求する方法
NSUndoManager クラスを使用して、アンドゥ操作を登録する2つの方法を提供します。
- 簡単な登録の場合は、registerUndoWithTarget:selector:object: を呼び出します。これは、ターゲットオブジェクト、セレクタ、および単一の引数を取ります。
- 呼び出しベースの登録については、prepareWithInvocationTarget: を呼び出し、変更を元に戻すために送信するメッセージをカプセル化する NSInvocation オブジェクトに渡します。このアプローチを使用すると、引数の型と数をいくつでも持つことができます。
変更されているオブジェクトのプロパティ用のアクセサメソッドでこれらのメソッドを頻繁に呼び出します。アンドゥや、やり直し操作を要求するには、NSUndoManager オブジェクトに undo や redo メッセージを送ります。
アンドゥマネージャとレスポンダチェーン
レスポンダチェーンは、デフォルトのアンドゥマネージャが活動している時でも、アンドゥマネージャで重要な役割を果たしています。UIKit と AppKit フレームワーク(UIResponder または NSResponder) のいずれかでも responder クラスは、それぞれ undoManager プロパティや undoManager メソッドを宣言します。アプリケーションが、アンドゥイベントを受信すると、レスポンダクラスは第一レスポンダから始まり、そこから(undoManager プロパティまたはメソッドを介して) NSUndoManager オブジェクトを探してレスポンダチェーンを上がって行きます。レスポンダチェーンの最後に到達した場合は、ウィンドウオブジェクトがデフォルトのアンドゥマネージャーを作成し、返します。
デフォルトのアンドゥマネージャに加えて、特定のコンテキストのアンドゥマネージャが必要な場合は、レスポンダサブクラスは undoManager プロパティを実装するか、またはそれを作成して返すメソッドを実装できます。レスポンダサブクラスは、多くの場合、カスタムビューですが、それはまた、iOS では(それが第一レスポンダになることを確認する必要があります) ビューコントローラです。アンドゥマネージャを戻すには、OS X では、ウィンドウオブジェクトのデリゲートは windowWillReturnUndoManager: を実装できます。
アンドゥとやり直しを要求するためのユーザーインタフェース
ユーザーはさまざまな方法で、OS X と iOS でアンドゥとやり直し操作を要求します。Mac のアプリでは、ユーザーは、[編集(Edit)] メニューから[アンドゥ(Undo)] または[やり直し(Redo)] メニューコマンドを選択します。iOS アプリケーションでは、ユーザは、デバイスを振ります。振るのはコマンドとして機能するためで、UIApplication の applicationSupportsShakeToEdit プロパティが YES に設定されている必要があり、アンドゥマネージャが適切な状態になっていなければなりません。これらの条件が適用される場合、アプリケーションは、アンドゥとやり直しのボタンでアラートビューを表示します。iOS と OS X の両方で、アンドゥとやり直しのコマンドに、特定のアクション名を付けることができますー例えば、Undo Color Change と。
前提条件の記事
レスポンダ・オブジェクト
アクセッサ・メソッド
関連記事
メインイベントループ既知のディスカッション
アンドゥ・アーキテクチャ