2015-03-22 1 views
0

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

Вот мой код:

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

Но это результат сортировки:

enter image description here Что мне нужно с первой строкой «» и после того, как ааа, ГЭБ, сссс, ддд ,

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

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

Выход в консоли содержания NSArrayController является следующее:

(lldb) ро _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; 
}) 
) 

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

Я действительно ценю Вас помочь

+0

Log содержимое контроллера массива таким образом, мы можем видеть струны для себя. Кроме того, из контекста я бы ожидал, что 'self.nameAC' будет' NSArrayController'. Было бы разумно установить для этого свойство 'sortDescriptors'. Тем не менее, ваш код извлекает свой «контент» и устанавливает на нем 'sortDescriptors'. Это не имеет смысла. Что такое 'self.nameAC' и' self.nameAC.content'? –

+0

self.nameAC является NSArrayController, а контент является свойством NSArrayController. – user2924482

+0

Я знаю, что 'content' является свойством' NSArrayController', но что он обозначает * в вашем случае *? Что это за объект * в вашем случае *? Свойство объявляется с типом 'id', поэтому никто не может догадаться, что вы с ним делаете, если вы не сообщите нам. Почему вы устанавливаете дескрипторы сортировки на этом, а не на самом контроллере массива? Покажите результат регистрации 'self.nameAC' и' self.nameAC.content'. –

ответ

2

массив контента содержит управляемые объекты для тегов объекта. Эти объекты имеют свойство 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];