我有一个与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的问题,还是我必须运行自定义比较器块?
答案 0 :(得分:2)
您忘记了尾随冒号:
,它是选择器的一部分:
@selector(localizedCaseInsensitiveCompare:)
sortDescriptorWithKey
使用键值编码来访问属性是正确的。