NSArrayController のに登録された要素を重複する方法を探したんだけど、簡単な方法が見つからなかったので、NSCountedSet を使った方法をメモする。もっと簡単な方法が見つかれば、また書き換える。誰かご存知でしたらぜひご一報を。
NSCountedSet オブジェクトは initWithArray で配列から作れて、配列の重複する要素が除外される。そのできた NSCountedSet オブジェクトに allObjects というメソッドをを使うと配列が取り出せる。
まず、@aryCtl という Array Controller に addObjects で fileAry という配列を追加する。
@aryCtl.addObjects(fileAry)
それから、その Array Controller から arrangedObjects で配列を取り出して initWithArray で重複している要素を排除した NSCountedSet オブジェクトを作り、allObjects で配列として取り出して uniqFiles という配列をつくる。
countedSet = NSCountedSet.alloc.initWithArray(@aryCtl.arrangedObjects)
uniqFiles = countedSet.allObjects
ここで、元の Array Controller を arrangedObjects ですべての要素を指定して removeObjects で空にする。
@aryCtl.removeObjects(@aryCtl.arrangedObjects)
配列が長いものを扱うときには、removeObjectsAtArrangedObjectIndexes(indexSet) を使った方が処理が速い。
@aryCtl.setSelectionIndexes(NSIndexSet.indexSetWithIndexesInRange([0,@aryCtl.arrangedObjects.length]))
その後 Array Controller に addObjects で 重複を排除した配列 uniqFiles を追加する。
@aryCtl.addObjects(uniqFiles)
これで、Array Controller の中身の配列に重複はなくなる。
まとめるとこんな感じ。
@aryCtl.addObjects(fileAry)
uniqFiles = NSCountedSet.alloc.initWithArray(@aryCtl.arrangedObjects).allObjects
@aryCtl.setSelectionIndexes(NSIndexSet.indexSetWithIndexesInRange([0,@aryCtl.arrangedObjects.length]))
@aryCtl.addObjects(uniqFiles)