私はNSArrayController
, NSMutableArray
andを使用してNSTableView
、独自のカスタム オブジェクトのリストを表示しています (ただし、バニラNSString
オブジェクトのリストだけを表示している場合でも、この質問はおそらく当てはまります)。
さまざまな時点で、配列をクリアし、データ ソースからデータを更新する必要があります。removeAllObjects
ただし、オブジェクトを呼び出すだけでNSMutableArray
は KVO の更新がトリガーされないため、画面上のリストは変更されません。
NSArrayController
利用可能なメソッドがありません removeAllObjects
。これは本当に奇妙に思えます。(これaddObject
を使用してオブジェクトを追加し、KVO が確実にトリガーされ、UI が更新されるようにします。)
これを正しく発生させることができた最もクリーンな方法は次のとおりです。
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
...そのため、KVO 通知を自分で手動で行う必要があります (これは、前述のように、myArray
プロパティを含むテスト アプリ クラスにあります)。NSMutableArray
これは間違っているようです - もっと良い方法はありますか? removeAllObjects
私のグーグル検索から、 inの欠如に混乱している人が何人かいるようですが、NSArrayController
より良い解決策は見られませんでした。
私はこの解決策を見てきました:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
しかし、これは私にはさらに不快に見えます。少なくとも私の解決策は、少なくともわずかに自己文書化しています。
NSArrayController
Apple は、オブジェクトを介して管理されているリスト コントロールを空にしたい場合があることに気付かなかったのですか? これは当たり前のように思えるので、何かが欠けているに違いないと思います...
余談ですが、もちろん、( 経由でNSArrayController
) 配列に新しい項目を追加すると、 で KVO 更新がトリガーされますがNSArrayController/NSTableView
、
- 何もないので、リストにアイテムを入れないことがあります。だからあなたはただ古いアイテムを見るだけです。
- これはとにかくヤバい。