12

私のアプリはまだCoreDataを使用していません。元に戻す/やり直しにコアデータを使用する必要があるというのは本当ですか?

そして:ユーザーはどのように元に戻す/やり直しをしますか?私はそれが実際に動作しているのを見たことがなく、使用したこともありません。やりたいのならどうしたらいいのかわからない。どこにも元に戻す/やり直しボタンはありません。それでも彼らはそれが元に/やり直しを持っていると言います。では、ユーザーはどのようにこれをトリガーしますか?

4

1 に答える 1

35

iPhone OS 3.0は、MacからNSUndoManagerの概念を取り入れました。これは、iPhoneで元に戻すことを可能にするものです。NSUndoManagerは、NSInvocationsのスタックを維持します。これは、編集やその他の変更とは逆のアクションです。例えば、

- (void)observeValueForKeyPath:(NSString*)keyPath
                      ofObject:(id)object
                        change:(NSDictionary*)change
                       context:(void*)context
{
    NSUndoManager *undo = [self undoManager];
    // Grab the old value of the key
    id oldValue = [change objectForKey:NSKeyValueChangeOldKey];
    // Add edit item to the undo stack
    [[undo prepareWithInvocationTarget:self] changeKeyPath:keyPath 
                                                  ofObject:object 
                                                   toValue:oldValue];
    // Set the undo action name in the menu
    [undo setActionName:@"Edit"];
}

プロパティの変更を監視するために使用でき、それらのプロパティの編集を元に戻す逆NSInvocationsを作成します。

元に戻すためにコアデータは必要ありませんが、それにより、はるかに簡単になります。管理対象オブジェクトの階層をカスケード削除するなどの複雑なアクションを含め、データモデルを編集するたびにこれらの元に戻すアクションの作成を処理します。

iPhoneで、元に戻す/やり直しを有効にするには、いくつかの設定が必要です。まず、iPhoneのNSManagedObjectContextsにはデフォルトでUNDOマネージャーがないため、以下を作成する必要があります。

NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init];
[contextUndoManager setLevelsOfUndo:10];
[managedObjectContext setUndoManager:contextUndoManager];
[contextUndoManager release];       

このコードは通常、NSManagedObjectContextを作成した直後に配置されます。

コンテキストに元にできるマネージャーが提供されたら、iPhoneで元に戻すためのデフォルトのジェスチャー、つまりデバイスのシェイクを有効にする必要があります。アプリケーションがこのジェスチャを自動的に処理できるようにする-applicationDidFinishLaunching:には、アプリケーションデリゲートのメソッド内に次のコードを配置します。

application.applicationSupportsShakeToEdit = YES;

最後に、元に戻すためのシェイクジェスチャを処理できる各ViewControllerを設定する必要があります。-undoManagerこれらのビューコントローラーは、メソッドをオーバーライドすることにより、そのコントローラーに使用するUNDOマネージャーを報告する必要があります。

- (NSUndoManager *)undoManager;
{
    return [[[MyDatabaseController sharedDatabaseController] scratchpadContext] undoManager];
}

ビューコントローラは、ジェスチャを処理する最初のレスポンダーになる必要もあるため、次の方法が必要です。

- (BOOL)canBecomeFirstResponder 
{
    return YES;
}

ビューコントローラは、画面に表示されたときに最初のレスポンダーになる必要があります。[self becomeFirstResponder]これは-loadViewまたはを呼び出すことで実行できますが-viewDidLoad、起動直後に画面に表示されるView Controllerを機能させるには、このメッセージを少し遅らせる必要があることがわかりました。

[self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.3];

これらすべてが整ったら、Core Dataのおかげで、素晴らしいアニメーションメニューを使用して、自動の元に戻すとやり直しのサポートを利用できるようになります。

于 2010-03-15T20:11:11.863 に答える