2010-01-14 7 views
0

Привет,Tableview sortDescriptorsDidChange: не вызывался

У меня есть NSTableView с двумя столбцами, который работает отлично ... кроме: Если я устанавливаю дескриптор сортировки таблицы в Interface Builder, все работает, как ожидалось, и sortDescriptorsDidChange получает как ожидалось. Если, однако, я не установить сортировки дескрипторов в Interface Builder и вместо того, чтобы использовать эту функцию:

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

(где «имя» является идентификатором для крайнего левого столбца) в моем коде, sortDescriptorsDidChange никогда не будет вызываться , Когда я читал (неправильно читал?) Документацию Apple для NSTableView, то, что я делаю, я думаю, должен работать. Что я делаю не так?

P.S. Я знаю, что я мог бы также использовать NSArrayController для всего этого (и если я это делаю хорошо), но по какой-то причине я решил не делать этого.

+0

в какой момент вы звоните 'setSortDescriptors'? По моему опыту, я назвал это слишком рано (например, awake from nib), когда объект (в вашем случае 'tableView') еще не был создан. – catsby

+0

Возможно, это так. Я вызываю setSortDescriptors в windowControllerDidLoadNib (я, возможно, ошибочно думал, что это было правильное место для такого рода вещей в приложении на основе документов). Я только что проверил, и после вызова [myTableView setSortDescriptors] возвращается [myTabeView sortDescriptors] ноль. Где (когда) - правильное место (время), чтобы сделать такой вызов (или я должен задать новый вопрос о том, что происходит при запуске окна?) Спасибо! – notMyScreenName

+0

Followup: Я перевел вызов setSortDescriptors в метод нажатия кнопки. Вызов setSortDescriptors программным образом вызывает вызов sortDescriptorsDidChange, но щелчок по заголовку столбца таблицы по-прежнему отсутствует. Должен ли я по-прежнему устанавливать что-то другое для этого (действие для щелчка на заголовке столбца или что-то в этом роде)? Я подумал от чтения документации, что такая вещь не нужна. – notMyScreenName

ответ

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]; 
    } 
} 
Смежные вопросы