Сортировка NSTableColumn с помощью NSArrayController - PullRequest
2 голосов
/ 24 октября 2011

У меня есть NSArrayController, связанный с NSTableView, поэтому столбец таблицы выглядит следующим образом:

NSTableView bindings:
Content -> ArrayController.arrangedObjects
SelectionIndexs -> ArrayController.arrangedObjects
SortDescriptors -> ArrayController.sortDescriptors

NSTableColumn bindings:
Value -> ArrayController.arrangedObjects.description

Когда я пытаюсь отсортировать его с помощью заголовка столбца, он просто падает с чем-то вроде

error setting value for key path sortDescriptors of object NSArrayController

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Я боролся с точно такой же проблемой сегодня.

Кажется, что привязка содержимого и selectionIndexes tableView к контроллеру массива IB > inspector window > select your tableView > bindings tab отключает сортировку, щелкая заголовок таблицы.Это имеет смысл, потому что табличное представление теперь показывает вам точное содержимое (и порядок) контроллера массива.

Я снял эти привязки в IB, также удалил все ключи сортировки из столбцов таблицы IB > inspector window > select your NSTableColumn > attributes pane.Установите флажок Creates Sort Descriptor на вкладке привязки столбца таблицы.Для таблицы не требуется sortDescriptor, хотя я думаю, что привязка sortDescriptor таблицы к Shared User Defaults Controller сохраняет порядок при выходе из приложения.

Если вам нужно отсортировать таблицу, поместите sortDescriptor в контроллер массива,может быть, в awakeFromNib.

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"propertyOfYourObject" ascending:YES selector:@selector(compare:)]]];
}

Это не мешает щелкать заголовки столбцов таблицы.

Я не могу заставить sortDescriptor на контроллере массива работать с привязками.

0 голосов
/ 01 декабря 2014

Я вижу несколько проблем в вашей попытке привязки.

  1. Обычно вообще не нужно связывать NSTableView.Достаточно привязать значения конкретных NSTableColumn s к NSArrayController.

  2. Вы пытаетесь связать что-то со свойством .description .Пожалуйста, помните - « description » похоже на «зарезервированное слово» в Obj-C.Любой объект NSObject должен представлять себя как NSString в своем методе "description".Это то, что вызывается, когда вы po <object> в отладчике или передаете NSObject в NSLog через "% @".Так что ... возможно, вы захотите переименовать вашу собственность во что-то еще.

  3. Вам НЕ нужно связывать дескрипторы сортировки NSArrayController или NSTableView илиNSTableColumn вообще.Как это бывает, когда вы связываете значение NSTableColumn с NSArrayController s arrangedObjects, объект NSTableColumn (фактически NSColumnHeader) знает, как установить NSArrayController s sortDescriptor втот же путь, который вы указали для привязки значения столбца - при нажатии на заголовок столбца.Другими словами - сортировка нажатием на заголовки столбцов происходит бесплатно, если вы просто привязываете значение вашего столбца к selectedObjects NSArrayController.

Документация по связыванию таблиц плохая и неприятная.Существует несколько различных схем для работы с таблицей, и отладка проблем привязки - настоящий кошмар.Тем не менее, для этого есть множество эссе и учебных пособий.

Надеюсь, это поможет.

0 голосов
/ 24 октября 2011

Позвольте мне предложить вам простой способ сделать это -

NSTableColumn bindings:

Value -> 

Bind to: ArrayController

Controller Key : arrangedObjects

Model Key Path : keyPath (such as name)

Если вы новичок в использовании привязок с табличным представлением, эта статья будет вам очень полезна -

РЕДАКТИРОВАТЬ: Проект перемещен в Github.(Больше никаких объяснений - только код)

NSTableView, NSArrayController и другие привязки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...