0

ビューコントローラーといくつかのサブビューコントローラーがあるという複雑な状況があります。

状況 A:サブ ビュー コントローラーを変更すると、変更が NSUndoManager に記録され、サブ ビュー コントローラーで undo メソッドが呼び出され、正常に動作します。

-(void)setElementTransform:(NSString *)transform
{
    NSUndoManager *undoManager = [Global sharedGlobalInstance].undoMgr;
    [undoManager registerUndoWithTarget:self selector:@selector(setElementTransform:) object:self.element.transform];
    self.element.transform = transform;
    self.view.transform = CGAffineTransformFromString(transform);
}

状況 B:これはもう少し複雑です。サブ ビュー コントローラーを削除すると、NSUndoManager に (メイン ビュー コントローラーの) 元に戻すメソッドが記録されます。その削除を元に戻すと、NSUndoManager はメイン ビュー コントローラーで undo メソッドを呼び出し、サブ ビュー コントローラーを再作成します。それもうまくいきます。

問題は、状況 A の後に状況 B を実行すると、アンドゥ スタックに 2 つあることです。状況 B を元に戻すことはできますが、状況 A には存在しないサブ ビュー コントローラーの元に戻すメソッドへの参照があります (状況 B で削除して元に戻すことによって削除され、再作成されました)。

古いサブビューコントローラーへの参照を変更できるように NSUndoManager を更新する方法はないと思いますか?

他にどうすればこれに対処できますか?

4

1 に答える 1

2

破棄されないオブジェクトを使用して、すべての元に戻すアクションを登録できます。たとえば、最上位のビュー コントローラー、アプリのデリゲート、または別のシングルトンなどです。次に、 registerUndoWithTarget:selector:object: の object 引数に、適切なサブ ビュー コントローラーまたはその置換に元に戻すアクションを適用するのに十分な情報を含める必要があります。

無効なサブ ビュー コントローラーを対象とするアクションを取り消しスタックから取得する必要がある場合は、サブ ビュー コントローラーの dealloc (または必要に応じて viewWillDisappear または viewDidUnload) メソッドで removeAllActionsWithTarget:self を呼び出します。

于 2013-03-19T03:48:35.423 に答える