Cocoa:我可以按文件名排序,如何按文件扩展名排序?

时间:2010-12-13 19:06:24

标签: iphone objective-c cocoa

以下是我的回答:

-(IBAction)sortBySelectedFilter {
    ...
    [self sortWithKey:@"filename" ascending:ascending selector:@selector(compareFileType:)];
    ...
}

-(void)sortWithKey:(NSString *)name ascending:(BOOL)asc selector:(SEL)sel {
    NSSortDescriptor *byKey = [[[NSSortDescriptor alloc] initWithKey:name
                                                           ascending:asc
                                                            selector:sel] autorelease];
    self.fileNames = [NSMutableArray arrayWithArray:[self.fileNames sortedArrayUsingDescriptors:[NSArray arrayWithObject: byKey]]];
    ...
}

@interface NSString (FileExtension) 

- (NSComparisonResult)compareFileType:(NSString *)filename;

@end

#import "NSString+FileExtension.h"

@implementation NSString (FileExtension)

-(NSComparisonResult)compareFileType:(NSString *)filename {
    return [[NSString stringWithFormat:@"%@, %@", [self pathExtension], [self stringByDeletingPathExtension]]
            compare:
            [NSString stringWithFormat:@"%@, %@", [filename pathExtension], [filename stringByDeletingPathExtension]]];
}

@end

1 个答案:

答案 0 :(得分:1)

您尚未提及是否直接使用Core Data或SQLite。使用Core Data,您可以使用自定义NSManagedObject子类(请记住在托管对象模型中设置类)。这个子类有一个 - (NSString *)扩展方法,它要求self -valueForKey:@“filename”并只返回文件名的扩展名(使用NSString的-pathExtension方法)。然后将您的排序键更改为“扩展名”,它应该工作。

注意:如果您使用的是Core Data和SQLite商店类型,则无法使用此方法获取或以其他方式进行查询,因为它并不真正作为属性存在在你的商店里。

如果您没有使用Core Data,我认为您的对象已经拥有自己的类,因此应该明白如何添加-extension方法。