NSMutableArray の挿入・削除の観察
質問
あるクラスに、合成されたアクセサを持つ NSMutableArray 型のプロパティ (およびインスタンス変数) があります (via.
@property
). を使ってこの配列を観察すると
[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
そして、このような配列にオブジェクトを挿入します。
[myObj.theArray addObject:NSString.string];
observeValueForKeyPath...ノーティフィケーションは ではなく が送信されます。しかし、次のようにすると、適切な通知が送られます。
[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
これは
mutableArrayValueForKey
はオブザーバへの通知の世話をするプロキシオブジェクトを返すからです。
しかし、合成されたアクセサは自動的にそのようなプロキシオブジェクトを返してはいけないのでしょうか?これを回避する適切な方法は何でしょうか。
[super mutableArrayValueForKey...]
?
どのように解決するのですか?
<ブロッククオートしかし、合成されたアクセサは自動的にそのようなプロキシオブジェクトを返すべきではないでしょうか?
いいえ。
<ブロッククオート
この問題を回避する適切な方法は何でしょうか。
[super mutableArrayValueForKey...]
?
いいえ、実装してください。 配列のアクセサー . これらを呼び出すと、KVOは自動的に適切な通知をポストします。つまり、あなたがしなければならないのは
[myObject insertObject:newObject inTheArrayAtIndex:[myObject countOfTheArray]];
で、「正しいこと」が自動的に行われます。
便宜上
addTheArrayObject:
アクセサを書くことができます。このアクセサは、上で説明した実配列のアクセサのいずれかを呼び出すことになります。
- (void) addTheArrayObject:(NSObject *) newObject {
[self insertObject:newObject inTheArrayAtIndex:[self countOfTheArray]];
}
(配列の中のオブジェクトの適切なクラスは
NSObject
.)
では、代わりに
[myObject insertObject:…]
の代わりに
[myObject addTheArrayObject:newObject]
.
悲しいかな
add<Key>Object:
とその対になる
remove<Key>Object:
は、私が最後に確認したところでは、KVOが認識するのは配列プロパティではなく、セット(NSSetのような)プロパティのみです。したがって、KVOが認識するアクセサの上に実装しない限り、それらを使用して無料のKVO通知を取得することはできません。これについては、x-radar://problem/6407437 というバグを提出しました。
私は アクセサーセレクタの全形式のリスト をブログで公開しています。
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?
-
[解決済み] Cocoa Autolayout: コンテンツの抱擁 vs コンテンツの圧縮抵抗の優先順位
-
[解決済み】UIImage (Cocoa Touch) または CGImage (Core Graphics) からピクセルデータを取得する方法は?)
-
[解決済み] CFStringRefをNSStringに変換する方法は?
-
[解決済み] NSTextFieldにテキストを設定する方法を教えてください。
-
[解決済み] NSDateを年、月、日、時、分、秒の各スタイルにフォーマットする。
-
[解決済み] NSArrayの要素をNSStringに結合するには?
-
[解決済み] EXC_BREAKPOINT(SIGTRAP)」例外はデバッグ用ブレークポイントが原因か?
-
[解決済み] Swiftでアプリ名を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Swift のプロトコル: メソッドがスーパークラスのメソッドをオーバーライドしない。
-
[解決済み] Cocoa:フレームとバウンドはどう違うの?
-
[解決済み] NSOrderedSetが生成するアクセサで例外が発生する。
-
[解決済み】Core Data vs SQLite 3 [終了しました。]
-
[解決済み】実行時に「Interface Builderファイル内の不明なクラス<MyClass>」というエラーが発生する。
-
[解決済み] CFStringRefをNSStringに変換する方法は?
-
[解決済み] NSTextFieldにテキストを設定する方法を教えてください。
-
[解決済み] NSStringインスタンスがNSArrayに含まれるかどうかをチェックする。
-
[解決済み] Swiftでアプリ名を取得する
-
NSImageを新規ファイルとして保存する方法