我正在使用NSFetchedResultsController来检索UITableView的数据。它工作正常。现在我需要放置三个按钮,这些按钮应该在表视图上触发不同的排序。为实现这一点,我实施了:
switch (selectedOrder) {
case 0:
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
break;
case 1:
/*
sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price" ascending: NO
comparator: ^(id obj1, id obj2) {
NSLog(@"Test");
return numSort(obj1, obj2, nil);
//return NSOrderedSame;
}];
*/
sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price"
ascending: NO
selector:@selector(compareAsFloats:)];
break;
...
default:
break;}
我似乎没有办法让第二种情况(价格)起作用。实际上,如果我使用块,它确实考虑了属性,但是作为字符串,而不是数字。这就像块中的代码根本没有执行。事实上,如果我只是返回NSOrderedSame,它仍然将它命令为字符串。并且不执行日志。如果我使用@selector(compareAsFloats :)版本,在NSString类别上定义方法,我会收到运行时错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor selector: compareAsFloats:'
*** Call stack at first throw:
(
0 CoreFoundation 0x014df5a9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x01889313 objc_exception_throw + 44
2 CoreData 0x01211266 -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 1270
3 CoreData 0x011494d8 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 488
4 CoreData 0x011492e1 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49
5 CoreData 0x0114918e -[NSSQLCore newRowsForFetchPlan:] + 430
..... .....
)
我一定是犯了一个非常微不足道的错误。 谢谢你的帮助。
答案 0 :(得分:1)
为什么不将价格保存为十进制数(即NSDecimalNumber),它没有像double和float这样的精度问题。
然后您可以使用价格对数据进行排序。
答案 1 :(得分:-1)
我完成此操作的方法是在按钮的IBAction中定义排序并在@property中创建NSFetchRequest *请求。在按钮操作中,我这样做:
self.request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]];
[self.fetchedResultsController performFetch:&error];
[tableView reloadData];