2011-02-04 26 views
9

Tôi đang cố gắng tạo các phần trong chế độ xem bảng dựa trên bảng chữ cái và sắp xếp các mục nhập theo thứ tự abc trong các phần này.NSPredicate trên NSDictionary

Tôi đã thu thập chữ cái đầu tiên trong mỗi mục nhập của bandsArray trong bandsArrayIndex và bây giờ tôi đang cố gắng sử dụng NSPredicate để đếm số lượng thư có trong mỗi thư.

Tôi đang làm điều này bằng cách theo dõi this guide.

Họ đang sử dụng NSArray và tôi đang sử dụng NSDictionary và dường như không làm cho nó hoạt động. Ai có thể giúp tôi không?

Ứng dụng gặp sự cố khi cố hiển thị chế độ xem với chế độ xem bảng trong đó. Trong Debugger điều khiển các lỗi sau đây được hiển thị:

* Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: 'Không thể làm một hoạt động chuỗi với cái gì đó không phải là một chuỗi

Đây là mã của tôi

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

EDIT: Đây là ban nhạc của tôi sArray.

Tiêu đề

NSMutableArray *bandsArray; 

@property (nonatomic, retain) NSMutableArray* bandsArray; 

Việc thực hiện

// 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]]; 
+0

Bạn đang rò rỉ bộ nhớ như cái rây khi bạn tạo 'bandsArray '. –

+0

Bạn có thể hiển thị bandsArray của mình không? Nó chỉ là một mảng NSString? Tôi không gặp vấn đề gì với NSPredicate. Nó chỉ là một chi tiết đơn giản. Nếu bandsArray của bạn không phải là NSStrings, bạn nên lọc theo thuộc tính bạn đang tìm kiếm. –

Trả lời

22

Bạn có nghĩa là bandsArray là một mảng của các từ điển? Nếu vậy, và giả sử mỗi từ điển có một khóa name, bạn sẽ có thể thay đổi vị từ thành một cái gì đó như @"SELF.name beginswith[c] %@".

Nếu, mặt khác, bandsArray thực sự là từ điển, có thể bạn muốn thực hiện [[bandsArray allKeys] filteredArrayUsingPredicate...].

+0

'@" SELF.name bắt đầu bằng [c]% @ "' đã thực hiện thủ thuật! Cảm ơn nhiều! – simonbs

+0

Cảm ơn bạn đã làm việc như một sự quyến rũ! – Meet

0

Xin lỗi, tôi không nhận thấy bạn có NSArray của NSDictionaries.

đã đọc chủ đề này: Using NSPredicate to filter an NSArray based on NSDictionary keys

Khi bạn sử dụng NSDictionary, bạn nên kiểm tra bởi chính nó ... Tôi không chắc chắn bạn đang sử dụng cách tiếp cận đúng!

Tôi sẽ làm điều gì đó như: @implementation Lời: NSObect { NSString * title; }

sau đó tôi sẽ tạo ra một NSArray of Words và lọc trên chúng với: @ "title beginswith [c]% @"

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; 
} 
+0

Đây là câu trả lời đúng, đã được kiểm tra! –

+1

Cảm ơn @isaak nó đã giúp tôi rất nhiều –