1

NSTableViewの列には、NSArrayControllerにバインドされた列があります。NSTableViewの最初のSortDescriptorの設定とメンテナンス

  • 旗未読
  • 件名
  • 添付ファイルのサイズが

添付ファイルのサイズの欄をクリックすることができ、ユーザがソートする場合:

テーブルビューには、電子メールメッセージのリストを示していリストが、私はにテーブルを最初に "未読"フラグで最初にによってソートされるようにしたいので、未読のメッセージは常にlisの最上部に残るようにしてくださいt。

私はアレイコントローラのソート記述子を何かにバインドしませんでしたが、テーブルソートはテーブル列をクリックすることで魔法のように機能します(なぜ?)。アレイコントローラのソートディスクリプタの設定を傍受し、最初に「未読」のソートディスクリプタを挿入する方法はありますか?添付ファイルのサイズによってソートされたテーブルの

例:表の列は、そのバウンドNSArrayControllerは上setSortDescriptors:を呼び出すため

UNREAD▼ SUBJECT ATTACHMENT SIZE▼ 
------ ------- ------------------ 
    yes Hello.. 110kb 
    yes Test... 90kb 

    no Foobar 200kb 
    no Hey  100kb 
    no Test2 10kb 

答えて

0

まあ、それは「ただ働き」理由があります。まず、サブクラスNSArrayControllerは

arrangeObjectsをオーバーライドします:

- (NSArray *)arrangeObjects:(NSArray *)objects { 

    NSMutableArray *oldSorted = [[super arrangeObjects:objects] mutableCopy]; 
    NSMutableArray *newSorted = [NSMutableArray arrayWithCapacity:[oldSorted count]]; 

    for (id anObject in oldSorted) 
     if ([[anObject valueForKey:@"isUnread"] boolValue]) 
      [newSorted addObject:anObject]; 

    [oldSorted removeObjectsInArray:newSorted]; 
    [newSorted addObjectsFromArray:oldSorted]; 
    [oldSorted release]; 

    return newSorted; 
} 
これは私がそれについて移動する方法をされ、あなたがテーブルに並べ替え可能なままにしておきたいが、あなたは常に「未読」でソートしたいと仮定すると、

これは、未読メッセージを「先頭」(配列の先頭)に置きます。私はこれが最も効率的なソートアルゴリズムであるかどうかはわかりませんが、正しい方法だと思います。

0

awakeFromNibの間に配列コントローラにsortDescriptorsの配列を設定できると思います。 arrangeObjects:を強制する必要はありません、この機能は完全に内蔵されていない。あなたが列ヘッダーをクリックしたときに

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    NSSortDescriptor *unreadSorter = [[NSSortDescriptor sortDescriptorWithKey:@"isUnread" ascending:NO)] autorelease]; 
    NSArray *arrayOfSortDescriptors = [NSArray arrayWithObject:unreadSorter]; 
    [self setSortDescriptors:arrayOfSortDescriptors]; 
} 

列がまだソート可能なままになります。

関連する問題