【问题标题】:NSPredicate on NSDictionaryNSDictionary 上的 NSPredicate
【发布时间】:2011-06-21 13:37:35
【问题描述】:

我正在尝试根据字母表在表格视图中创建部分,并在这些部分下按字母顺序对我的条目进行排序。

我已经收集了bandsArrayIndex 中每个bandArray 条目中的第一个字母,现在我正在尝试使用NSPredicate 来计算每个字母有多少。

我正在关注this guide

他们使用的是 NSArray,而我使用的是 NSDictionary,但似乎无法让它工作。谁能帮帮我?

应用程序在尝试显示包含表格视图的视图时崩溃。 在调试器控制台中显示以下错误:

* 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因: '不能进行子串操作 不是字符串的东西

这是我的代码

- (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];
}

编辑:这是我的bandArray。

标题

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]];

【问题讨论】:

  • 你能展示你的bandArray吗?它只是一个 NSString 数组吗?我对 NSPredicate 没有这样的问题。它应该只是一个简单的细节。如果您的 bandArray 不是 NSStrings,则应按您要查找的属性进行过滤。
  • 当你创建bandsArray时,你正在像筛子一样泄漏内存。

标签: iphone objective-c nsdictionary nspredicate


【解决方案1】:

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

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

【讨论】:

  • @"SELF.name beginswith[c] %@" 成功了!非常感谢!
【解决方案2】:
#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;
}

【讨论】:

  • 感谢@isaak,它帮了我很多
【解决方案3】:

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

阅读本帖:Using NSPredicate to filter an NSArray based on NSDictionary keys

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

我会这样做: @实现字:NSOBect { NSString *标题; }

然后我会创建一个单词的 NSArray 并使用以下方法过滤它们: @"标题开头为[c] %@"

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多