【问题标题】:NSSortDescriptor for NSArrayController to sort alphabetically and by string lengthNSArrayController 的 NSSortDescriptor 按字母顺序和字符串长度排序
【发布时间】:2015-03-22 22:58:09
【问题描述】:

我有一个 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;
})
)

你们中的任何人都知道我做错了什么或者我该怎么做?

非常感谢您的帮助

【问题讨论】:

  • 记录数组控制器的内容,以便我们自己查看字符串。另外,从上下文来看,我希望self.nameACNSArrayController。在上面设置sortDescriptors 属性是有意义的。但是,您的代码正在获取其content 并在其上设置sortDescriptors。这似乎没有意义。 self.nameACself.nameAC.content 是什么?
  • self.nameAC 是一个 NSArrayController 并且 content 是 NSArrayController 的一个属性
  • 我知道contentNSArrayController 的属性,但是在您的情况下 指的是什么? 在你的情况下是什么类型的对象?该属性是用id 类型声明的,所以除非你告诉我们,否则没人能猜到你在用它做什么。为什么要在上面设置排序描述符而不是在数组控制器本身上?显示记录self.nameACself.nameAC.content 的结果。

标签: cocoa nstableview nsarraycontroller nssortdescriptor


【解决方案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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多