sortDescriptorWithKey用于通用NSManagedObject

时间:2013-11-09 19:19:39

标签: ios objective-c nsmanagedobject nssortdescriptor

我有一个与NSManagedObject Title具有多对多关系的NSManagedObject Book,它具有NSString属性titleName

Title对象未被子类化。它只是一个通用的NSManagedObject。因此,只需致电titleName,您就无法访问title.titleName;财产,必须致电[title valueForKey:@“titleName”];

我认为带密钥的NSSortDescriptor在访问该密钥时实际上会调用valueForKey,但显然不是;以下代码生成“无法识别的选择器”异常:

// Verify that “titles” have a property “titleName” that is an NSString.
for (NSManagedObject *title in self.book.titles)
    logIt(@"\ntitle name: %@.", [title valueForKey:@"titleName"]); // prints strings as expected, proving that “titleName” really is an NSString
// Set up the sort descriptor on “titleName” property and use it.
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"titleName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare)];
NSArray *arrayOfTitles = [self.book.titles sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

这是在崩溃时打印的内容: - [NSCFString localizedCaseInsensitiveCompare]:无法识别的选择器发送到实例...

看起来NSSortDescriptor未能深入挖掘字符串属性,因此它试图在某个未识别的非字符串对象上调用localizedCaseInsensitiveCompare。听起来不错吗?如果是这样,有没有办法解决使用NSSortDescriptor的问题,还是我必须运行自定义比较器块?

1 个答案:

答案 0 :(得分:2)

您忘记了尾随冒号:,它是选择器的一部分:

@selector(localizedCaseInsensitiveCompare:)

sortDescriptorWithKey使用键值编码来访问属性是正确的。