1

KVO準拠のメソッドを使用して配列からオブジェクトを挿入/削除することに関して質問があります。私はAaronHillegassのMacOSX用Cocoaプログラミングを使用していて、次のコード行を確認しました(insertObject:inEmployeesAtIndex:メソッド内:

[[undoManager prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];

私が間違っている場合は訂正してください。しかし、私はいつも電話mutableArrayValueForKey:してからremoveObjectAtIndex:...と思っていたので、上記の行を次のように変更してみました。

[[undoManager prepareWithInvocationTarget:[self mutableArrayValueForKey:@"employees"]] removeObjectAtIndex:index]; 

そして、それは機能しませんでした。誰かが違いと、最初の行が機能するのに2番目の行が機能しない理由を説明できますか?

更新:コレクションクラス(NSMutableArrayのインスタンス)をKVCに準拠させるために、removeObjectFromEmployeesAtIndex:indexメソッドが実装されています。したがって、最終的には、呼び出しは最終的に呼び出す[[self mutableArrayValueForKey:@"employees"] removeObjectAtIndex:index];必要があります[self removeObjectFromEmployeesAtIndex:index];

4

2 に答える 2

1

あなたのアップデートであなたは言う:

[[self mutableArrayValueForKey:@ "employees"] removeObjectAtIndex:index];を呼び出します。[self removeObjectFromEmployeesAtIndex:index]を呼び出すことになります。

removeObjectFromEmployeesAtIndex:残念ながら、NSMutableArrayはクラス内のメソッドを呼び出さないため、メソッドに何が含まれていても、これは正しくありません。元に戻す/やり直し機能を取得しようとしているように見えるので、のような方法を使用する必要がありますremoveObjectFromEmployeesAtIndex:。そうしないと、従業員を追加するために元に戻すを押したときに、その従業員の追加を「やり直す」方法がありません。また、個々の従業員の編集の元に戻す/やり直しで問題が発生する可能性があります。removeObjectFromEmployeesAtIndex:必要に応じて、メソッドの行[employees removeObjectAtIndex:index];を変更することもできますが、[[self valueForKey:@"employees"] removeObjectAtIndex:index];この[self.employees removeObjectAtIndex:index];ルートに進む理由は実際にはありません。

于 2010-06-30T03:56:16.687 に答える
0

はい。(本からの)最初の行は基本的にこれと同等です:

id tmp = [undoManager prepareWithInvocationTarget:self];
[tmp removeObejctFromEmployeesAtIndex:index];

ただし、コードは基本的に次のようになります。

id tmp1 = [self mutableArrayValueForKey:@"employees"];
id tmp2 = [undoManager prepareWithInvocationTarget:tmp1];
[tmp2 removeObjectAtIndex:index];

つまり、呼び出しを準備しているターゲットはコード内で異なります(selfと同じオブジェクトである場合を除きます[self mutableArrayValueForKey:@"employees"]。これは疑わしいです)。

于 2010-06-28T16:25:14.600 に答える