0

ご挨拶、

私は正常に動作する 2 つの列を持つ NSTableView を持っています... ただし、Interface Builder でテーブルのソート記述子を設定すると、期待どおりに動作し、sortDescriptorsDidChange が期待どおりに呼び出されます。ただし、Interface Builder でソート記述子を設定せず、代わりにこれを使用する場合:

[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]];

(ここで、「名前」は一番左の列の識別子です) 私のコードでは、sortDescriptorsDidChange は呼び出されません。NSTableView に関する Apple のドキュメントを読んだ (読み間違えた?) ので、私がやっていることはうまくいくはずです。私は何を間違っていますか?

PS私は、これらすべてにNSArrayControllerを使用することもできることを知っています(そして、それを行うとうまく動作します)が、何らかの理由で、そうしないことを選択しました.

4

1 に答える 1

0

これがなくても機能するはずですが、KVO通知を自分で送信してみましたか?

[tableView willChangeValueForKey:@"sortDescriptors"];
[tableView setSortDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:) ]autorelease]]];
[tableView didChangeValueForKey:@"sortDescriptors"]; 

IBに記述子を追加したくない場合は、次のようにすることができます。

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)theColumn row:(NSInteger)rowIndex {
    //if we have no sort descriptor for this column create one based on it's identifier (instead of setting it for each in IB,saves time and prevents errors)
    NSSortDescriptor *desc = [theColumn sortDescriptorPrototype];
    if ([desc key] == nil) {
        NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:[theColumn identifier] ascending:YES];  
        [theColumn setSortDescriptorPrototype:sorter];
        [sorter release];
    }
}
于 2011-05-09T22:26:00.547 に答える