0

再次从 N00B 登陆。我已经阅读了很多关于排序数组的内容——想尝试使用 block 方法,但还没有完全理解它。相反,我选择了描述符方法。我通过它们的 NSDate 属性阅读了自定义对象的排序 NSArray以及如何对包含自定义对象的 NSMutableArray 进行排序?在 oodles 和 oodles 中。在我的代码中,我这样做了:

NSString *lastHighScore = @"_highScore";
NSString *dateScoreCreated = @"_dateCreated";
NSSortDescriptor *highScoreDescriptor = [[[NSSortDescriptor alloc]
    initWithKey:lastHighScore                                        
    ascending:NO                                          
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];

NSSortDescriptor *dateScoreCreatedDescriptor = [[[NSSortDescriptor alloc]
                                      initWithKey:dateScoreCreated
                                      ascending:NO
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *descriptors = [NSArray arrayWithObjects:highScoreDescriptor, 
dateScoreCreatedDescriptor, nil];

NSArray *sortedArray = [[[FlipHighScoreStore sharedStore] allHighScores] sortedArrayUsingDescriptors:descriptors];

可悲的是,我一开始就遇到错误 - 初始化元素不是编译时元素。我查看了这个并尝试了设置NSSortDescriptor *highScoreDescriptor = nil,但随后我收到一条警告,说 highScoreDescriptor“缺少类型说明符,默认为 int”,在这种情况下是可以的,但对于下一个描述符中的 Date 对象来说就不是那么好了。(结果我也收到一个错误,说我正在用不同的类型重新定义 highSoreDescriptor。)

此外,是否有可用选择器的列表?我怀疑这localizedCaseInsensitiveCompare:是我想要使用的,因为第一个属性“_highScore”是一个 int,第二个“_dateCreated”是一个日期。我在某处读到默认值是“比较”,所以我可以输入“比较:”吗?(找到一个答案,我想 - 我可以使用 (intValue) 作为第一个描述符:

selector:@selector(intValue)] autorelease];

更多的阅读让我认为我可以完全取消选择器行来进行日期排序。那是对的吗?

最后,如果我说ascending:NO这和降序一样吗?我猜是这样,但人们永远不会知道编程,不是吗?

我是否将所有这些代码包装在自己的方法中?或者我可以(直到稍后)将它插入我正在布置表格的代码中吗?

这个项目不是 ARC。

4

1 回答 1

1

为了回答我自己的问题,在朋友的帮助下,我基本上做错了两件事。首先,我在一个方法之外编写代码——这就是为什么我得到所有关于初始化元素的错误。我想当我添加这个时我很累。

至于实际排序,我从描述符描述中删除了选择器选项,排序确实发生了!

最后,是的,ascending:NO等于降序。

最后一点,必须等到我准备好处理更多的应用程序重构。

于 2012-05-07T22:18:37.580 回答