0
- (void)cancel {
//   [managedObjectContext.undoManager disableUndoRegistration];
     [managedObjectContext deleteObject:object]; // I don't want this deletion to be recorded on the undo stack which is empty at this point.
//   [managedObjectContext.undoManager enableUndoRegistration];
     [managedObjectContext.undoManager removeAllActions];
}

このコードでは、元に戻るスタックで削除を取得しました。これらの2行のコメントを解除しても、記録を防ぐことはできません。なんで?

4

2 に答える 2

2

UNDO処理を無効にする前、および再度有効にする前に、管理対象オブジェクトコンテキストで-processPendingChangesを呼び出す必要があります。Core Dataは、processPendingChangesまでundoイベントの登録を遅らせて、同じ属性および同様のショートカットへの複数の変更を合体できるようにします。

于 2010-07-21T16:39:42.127 に答える
0

-キャンセルとは何ですか?他の方法でundoイベントを登録している状況に遭遇しました(コアデータがこれを「役立つ」ように行っている可能性があります)。-cancelの最後でundoスタックが空になっているのに、呼び出し元のメソッドによってイベントが追加されている場合があります。

このような場合、「元に戻す」を選択しても実際には何も(元に戻す)ことはなく、イベントは元に戻すことはできません。これらの不要なイベントを防ぐには、呼び出し元のメソッドで元に戻る登録を無効にする(そして再度有効にする)必要があります。の線に沿った何か...

- (void)doSomething {
    // Disable undo until we definitely want to undo stuff
    [managedObjectContext.undoManager disableUndoRegistration];

    // Stuff goes here

    if ( userCancelled ) {
        [self cancel];
        [managedObjectContext.undoManager enableUndoRegistration];
        return;
    }

    // We actually want user to be able to undo the following stuff
    [managedObjectContext.undoManager enableUndoRegistration];

    // More stuff goes here
}

これを深く掘り下げる前に、いくつかの簡単なNSLogチェックを実行して、いつUNDOスタックにあるかを確認します(そして、nilオブジェクトではなく実際のライブNSUndoManagerにメッセージを送信していることを確認します)。

于 2009-10-22T01:24:20.620 に答える