NSDictionary上的NSPredicate

9
我正在尝试基于字母在表视图中创建节,并在这些节下按字母顺序排序我的条目。
我已经收集了bandsArray中每个条目的第一个字母,并且现在正在尝试使用NSPredicate来计算每个字母有多少个条目。
我正在遵循这个指南进行操作。
他们正在使用NSArray,而我正在使用NSDictionary,似乎无法使其工作。有人能帮我吗?
当尝试显示包含表视图的视图时,应用程序会崩溃。在调试器控制台中显示以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do a substring operation with something that isn't a string'
这是我的代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSString *alphabet = [bandsArrayIndex objectAtIndex:section];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
    NSArray *letters = [bandsArray filteredArrayUsingPredicate:predicate];

    return [letters count];
}

编辑:这是我的bandsArray。

标题

NSMutableArray *bandsArray;

@property (nonatomic, retain) NSMutableArray* bandsArray;

实现

// set array from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Bands" ofType:@"plist"];
NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.bandsArray = tmpArray;

// sort array after name ascending
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[bandsArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];

你能展示一下你的bandsArray吗?它只是一个NSString数组吗? 我在使用NSPredicate时没有遇到这样的问题。这应该只是一个简单的细节问题。如果你的bandsArray不是NSStrings类型,你应该通过你要查找的属性进行过滤。 - Bruno Fuster
当你创建bandsArray时,你像漏勺一样泄露内存。 - Dave DeLong
3个回答

22

你的意思是 bandsArray 是一个字典数组吗?如果是这样,并且假设每个字典都有一个 name 键,那么您应该能够将谓词更改为类似于 @"SELF.name beginswith[c] %@" 的内容。

另一方面,如果 bandsArray 实际上是一个字典本身,也许您想要执行 [[bandsArray allKeys] filteredArrayUsingPredicate...]


@"SELF.name beginswith[c] %@" 做到了!非常感谢! - simonbs

6
#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}

1
谢谢@isaak,它帮了我很多。 - Vaibhav Limbani

0

抱歉,我没有注意到你有一个NSArray的NSDictionaries。

请阅读这个帖子:使用NSPredicate基于NSDictionary键过滤NSArray

当你使用NSDictionary时,你应该通过它的Key进行检查...我不确定你是否使用了正确的方法!

我会这样做: @implementation Word : NSObect { NSString *title; }

然后我会创建一个Words的NSArray,并用以下方式对它们进行过滤: @"title beginswith[c] %@"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接