2011-01-31 6 views
6

coredataでバックアップされたiphoneアプリケーションに元に戻すマネージャを追加します。ユーザーが(+ボタンをタップして)新しいオブジェクトを追加しようとすると、私は新しいモーダルビューコントローラをロードし、viewDidLoadで新しいアンドゥグループを開始します。CoreDataを使用した入れ子になった元に戻すグループ

キャンセルボタンを押すと、cancelActionコールバックの変更をロールバックします。

クエリ:

  1. それがネストされて元に戻すグループを開始し、イベントループを通してそれを持続し、1つのアンドゥグループで行われたすべての変更を照合することは可能ですか?今、私がcancelActionでbeginUndoGroupingを呼び出すと、beginUndoGrouping例外が見つからなくなります。
  2. NSUndoManagerのgroupsByEvent APIの重要性は何ですか?私はイベントループを通して元に戻すグループを維持するためにNOに設定する必要がありますか?
  3. 変更を永続的にするためにsaveActionコールバックで何を行う必要がありますか(mangedObjectContextのsaveを呼び出すこととは別)元に戻すマネージャーに変更の追跡を停止するように指示するにはどうすればよいですか?

エラーメッセージ:キャッチされない例外により 'NSInternalInconsistencyException'、理由にアプリを終了

*:「_endUndoGroupRemovingIfEmptyを:: NSUndoManager 0x75415f0は無効な状態にあり、

サンプルを開始していないマッチングと呼ばれるendUndoGroupingコード:

// RootViewController.m 
- (void) addAction { 
    // Load Modal View Controller to add new object 

} 

// AddViewController.m 
- (void) viewDidLoad { 
    // Start nested undo group 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager beginUndoGrouping]; 

    [self createModel]; 

} 

- (void) cancelAction { 
    // Revert all changes 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager endUndoGrouping]; 

    [self.managedObjectContext.undoManager undoNestedGroup]; 

    ... 
} 

- (void) saveAction { 

    // Save changes 
} 

答えて

7

具体的な質問から始まる - はい、手作業でdef beginUndoGroupingとendUndoGroupingを使用して取り消し操作の境界を設定します。

この場合、groupsByEventが設定されているかどうかにかかわらず、元に戻す操作が機能するはずです。これは、イベントループによって生成されたすべてのUNDOグループが、beginUndoGroupingで開始されたメインのオープンUNDOグループの下にネストされ、endUndoGroupingを呼び出した直後にundoNestedGroupを直接呼び出している限り機能するはずです。グループ化を取り消すイベントループを使用していない場合は、それを心配せずにNOに設定してください。

変更を永久に保存するには、endUndoGroupingで元に戻すグループを閉じ、コンテキストでsaveを呼び出します。 processPendingChanges呼び出しは不要で、ネストされたグループで問題を引き起こす可能性があります。元に戻す操作をクリアしたい場合は、endUndoGroupingの後でアンドゥマネージャーのremoveAllActionsを呼び出します。これにより、変更が決して元に戻らないことが保証されます。

開始点/終了呼び出しが1つであることを確認するには、breakpoints/nslogを使用します。viewWillDisappear

にendUndoGrouping viewWillAppearに

  • コールを

    • 移動beginUndoGrouping:あなたはあなたの 'ボタンを元に戻す' のようすべきアクションをキャンセルしたい場合は

      、次の操作を行う必要があるでしょうあなたの取り消しアクションの最後にグループ化

    • 再オープンアンドゥ

    • 再オープンあなたの行動

    を救うの最後にグループ化アンドゥそれ以外の場合は、あるとしてあなたはそれを残す場合は、複数回呼び出されるendUndoGroupingの可能性を回避するために、必ずあなたの保存と取り消しアクションでダイアログを閉じます。

    ご不明な点がございましたら、コメントしてください。

    幸運を祈る!

  • 関連する問題