NSSortDescriptor для NSArrayController для сортировки по алфавиту и по длине строки

У меня есть NSArrayController, и я пытаюсь отсортировать его по длине строки, а также по алфавиту. NSArrayController содержит строку с таким пробелом " ".

Вот мой код:

    NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDescriptorWithKey:@"length" ascending:YES];
[self.nameAC.content setSortDescriptors:@[lengthSorter, nameSortDescriptor]];

Но это результат рода:

введите здесь описание изображенияЧто мне нужно, чтобы сначала ввести строку " ", а после aaa, bbb, cccc, ddd.

Вывод в консоли NSArrayController (nameAC):

(lldb) po _nameAC
<NSArrayController: 0x6080001c05a0>[entity: Tags, number of selected objects: 1]

Вывод в консоли содержимого NSArrayController следующий:

(lldb) po _nameAC [сущность: Теги, количество выбранных объектов: 1]

(lldb) po _nameAC.content
<__NSArrayM 0x60000004f600>(
<Tags: 0x6000000a7260> (entity: Tags; id: 0x140002b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Tags/p5> ; data: {
    category = "0x40000b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Categories/p1>";
    product = "<relationship fault: 0x60800002ba80 'product'>";
    name = bbb;
}),
<Tags: 0x6000000a7200> (entity: Tags; id: 0x100002b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Tags/p4> ; data: {
    category = "0x40000b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Categories/p1>";
    product = "<relationship fault: 0x60800002a160 'product'>";
    name = aaa;
}),
<Tags: 0x6000000a7740> (entity: Tags; id: 0x1c0002b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Tags/p7> ; data: {
    category = "0x40000b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Categories/p1>";
    product = "<relationship fault: 0x60800002b940 'product'>";
    tagName = ddd;
}),
<Tags: 0x6000000a5ca0> (entity: Tags; id: 0x40002b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Tags/p1> ; data: {
    category = "0x40000b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Categories/p1>";
    product = "<relationship fault: 0x6080000283e0 'product'>";
    name = " ";
}),
<Tags: 0x6000000a76e0> (entity: Tags; id: 0x180002b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Tags/p6> ; data: {
    category = "0x40000b <x-coredata://B7756C1E-B9F2-4C57-A1FA-272478C4D6A6/Categories/p1>";
    product = "<relationship fault: 0x60800002a620 'product'>";
    name = cccc;
})
)

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

буду очень признателен за помощь


person user2924482    schedule 22.03.2015    source источник
comment
Зарегистрируйте содержимое контроллера массива, чтобы мы могли сами увидеть строки. Кроме того, исходя из контекста, я бы ожидал, что self.nameAC будет NSArrayController. Имеет смысл установить для него свойство sortDescriptors. Однако ваш код получает свой content и устанавливает для него sortDescriptors. Кажется, это не имеет смысла. Что такое self.nameAC и self.nameAC.content?   -  person Ken Thomases    schedule 23.03.2015
comment
self.nameAC является NSArrayController, а содержимое является свойством NSArrayController.   -  person user2924482    schedule 23.03.2015
comment
Я знаю, что content является свойством NSArrayController, но на что оно ссылается в вашем случае? Что это за объект в вашем случае? Свойство объявлено с типом id, поэтому никто не может догадаться, что вы с ним делаете, если вы не сообщите нам об этом. Почему вы устанавливаете дескрипторы сортировки на нем, а не на самом контроллере массива? Покажите результат регистрации self.nameAC и self.nameAC.content.   -  person Ken Thomases    schedule 23.03.2015


Ответы (1)


Массив содержимого содержит управляемые объекты для сущности Теги. Эти объекты имеют свойство name, но не имеют свойства length.

Если вы хотите создать дескриптор сортировки, который сортирует по длине name, вы должны использовать ключевой путь name.length. Так:

NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDescriptorWithKey:@"name.length" ascending:YES];

Кроме того, дескрипторы сортировки должны быть установлены на контроллере массива. Итак, где вы написали:

[self.nameAC.content setSortDescriptors:@[lengthSorter, nameSortDescriptor]];

должен быть:

[self.nameAC setSortDescriptors:@[lengthSorter, nameSortDescriptor]];

или просто:

self.nameAC.sortDescriptors = @[lengthSorter, nameSortDescriptor];
person Ken Thomases    schedule 23.03.2015