Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSSortDescriptor,用于NSArrayController按字母顺序和字符串长度排序_Cocoa_Nstableview_Nsarraycontroller_Nssortdescriptor - Fatal编程技术网

Cocoa NSSortDescriptor,用于NSArrayController按字母顺序和字符串长度排序

Cocoa NSSortDescriptor,用于NSArrayController按字母顺序和字符串长度排序,cocoa,nstableview,nsarraycontroller,nssortdescriptor,Cocoa,Nstableview,Nsarraycontroller,Nssortdescriptor,我有一个NSArrayController,我试图根据字符串的长度和字母顺序对它进行排序。NSArrayController包含一个空格为“”的字符串 这是我的密码: NSSortDescriptor *nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSSortDescriptor *lengthSorter = [NSSortDescriptor sortDe

我有一个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\u nameAC
[实体:标记,所选对象数:1]
NSArrayController内容控制台中的输出如下:

(lldb)采购订单名称AC [实体:标记,所选对象数: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;
})
)
(lldb)po\u nameAC.content
(
(实体:标记;id:0x140002b;数据:{
类别=“0x40000b”;
产品=”;
name=bbb;
}),
(实体:标记;id:0x100002b;数据:{
类别=“0x40000b”;
产品=”;
名称=aaa;
}),
(实体:标记;id:0x1c0002b;数据:{
类别=“0x40000b”;
产品=”;
标记名=ddd;
}),
(实体:标记;id:0x40002b;数据:{
类别=“0x40000b”;
产品=”;
name=“”;
}),
(实体:标记;id:0x180002b;数据:{
类别=“0x40000b”;
产品=”;
名称=中国交建;
})
)
你们有谁知道我做错了什么,或者我怎么做


非常感谢您的帮助

内容数组包含标记实体的托管对象。这些对象确实具有
名称
属性,但没有
长度
属性

如果要构造按
名称的长度排序的排序描述符,应使用键路径
名称.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];

记录阵列控制器的内容,以便我们自己查看字符串。另外,从上下文来看,我希望
self.nameAC
是一个
NSArrayController
。在上面设置
sortDescriptors
属性是有意义的。但是,您的代码正在获取其
内容
,并在此基础上设置
sortDescriptors
。这似乎没有道理。什么是
self.nameAC
self.nameAC.content
?self.nameAC是一个NSArrayController,而content是NSArrayController的属性我知道
content
是一个
NSArrayController
的属性,但在您的案例中它指的是什么?你的情况是什么样的?属性是用类型
id
声明的,因此除非您告诉我们,否则没有人能猜到您在用它做什么。为什么要在上面而不是在数组控制器本身上设置排序描述符?显示日志记录的结果
self.nameAC
self.nameAC.content
self.nameAC.sortDescriptors = @[lengthSorter, nameSortDescriptor];