1

NSUndoManager クラスを使用してアプリの 1 つで元に戻す/やり直し機能を設計しようとしており、設計上の問題がいくつか見られます。私のアプリでは、メソッドは 1 つだけです

-(IBAction) addLastBall:(Ball *)ball

そのため、ユーザーが UI でボタンを選択すると、ボール オブジェクトが配列リストに追加されます。ただし、ボールを削除するためのアクション ボタンはありません。これは UI ワークフローの設計であり、変更できません。したがって、取り消しを実装するために、addLastBall メソッド内で次のコードを呼び出しました。

[undoManager registerUndoWithTarget:self selector:@selector(removeBall:) object:ball];

これを行った後、ユーザーが取り消しを実行しようとすると、ボール オブジェクトで removeBall メソッドが呼び出されます。今のところすべて問題ありません。しかし、ユーザーがやり直そうとしたときに、どのメソッドが呼び出されるのかわかりません。ユーザーが元に戻す操作を使用して削除したばかりのボール オブジェクトを追加する必要があるためです。どんな洞察も非常に役に立ちます。

本当にありがとう。

4

2 に答える 2

1

やり直しは、対応する取り消しの実行中に登録された取り消しアクションを実行するだけです。したがって、最も簡単な解決策は、元に戻すアクションをremoveBall:メソッドに登録することです。

- (void)removeBall:(Ball *)ball {
    [undoManager registerUndoWithTarget:self 
                               selector:@selector(addLastBall:)
                                 object:ball];
    ...
}

prepareWithInvocationTarget:元に戻すアクションを登録するために使用する方が明確な場合があることに注意してください。

[[undoManager prepareWithInvocationTarget:self] addLastBall:ball];

ところで、removeBall:メソッド内のボールの保持カウントを 0 より大きく保つようにしてください — アンドゥ マネージャーはボールを保持しません。割り当てが解除されると、削除を元に戻すとクラッシュします。

于 2010-07-24T15:37:19.693 に答える
0

メソッド get は呼び出されません。NSUndoManager は、ユーザーがやり直しを選択した場合に実行される元に戻す操作 (やり直し) の逆を単純に保存します。

これはすべて NSUndoManager に実装されているため、心配する必要はありません。やり直し時にメソッドを呼び出したい場合は、独自の取り消しマネージャーを作成することを検討する必要がありますが、私はお勧めしません。非常に複雑になる可能性があり、さらに、NSUndoManager がすべてを完璧に処理します。

于 2010-07-19T17:16:39.230 に答える