Tôi có một nhóm các nghệ sĩ được lưu trữ trong CoreData và muốn sắp xếp chúng theo tên nhưng bỏ qua tiền tố "the". Vì vậy, ví dụ "The Beatles" sẽ được sắp xếp là "Beatles", giống như những gì iTunes/iPod làm.NSSortDescriptor để loại bỏ "tiền tố"
Vì vậy, tôi cố gắng thêm một thuộc tính tùy chỉnh cleanName
để mô hình Artist của tôi vì vậy nó có thể được sử dụng để phân loại với:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES];
Đó rõ ràng là mang xuống ứng dụng như cleanName
không phải là một tài sản của SQLEntity:
...keypath cleanName not found in entity <NSSQLEntity Artist id=1>
Tôi biết tôi có thể lưu cleanName trong cửa hàng, nhưng dường như điều đó có vẻ sai với tôi. Một thuộc tính mới chỉ để có tên bị tước bỏ tiền tố "the"? Có thật không?
Vì vậy, thay vào đó, tôi đã cố gắng subclassing NSSortDescriptor với một compareObject tùy chỉnh: toObject: thực hiện:
- (NSComparisonResult)compareObject:(Artist*)artist1 toObject:(Artist*)artist2 {
NSString *cleanString1 = [artist1.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist1.name length])];
NSString *cleanString2 = [artist2.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist2.name length])];
return [artist1.cleanName compare:artist2.cleanName options:NSCaseInsensitiveSearch];
}
này hoạt động khi tôi thêm một nghệ sĩ mới, nói "The Beatles" đến cửa hàng của tôi. Nghệ sĩ được sắp xếp là "Beatles" và được hiển thị bên trong phần "B" của tôi. Nhưng ngay sau khi tôi bỏ ứng dụng và khởi chạy lại nó, tôi nhận được lỗi sau và tableview chỉ nằm rỗng:
sectionIndex A for Apparat
sectionIndex B for Bonobo
sectionIndex M for Misteur Valaire
sectionIndex M for Moderat
sectionIndex P for Paul Kalkbrenner
sectionIndex R for Röyksopp
sectionIndex B for The Beatles
NSFetchedResultsController ERROR: The fetched object at index 6 has an out of order section name 'R. Objects must be sorted by section name'
Như bạn có thể nhìn thấy từ những gì tôi đang đăng nhập, các đề mục cũng tốt (The Beatles 'tiêu đề phần là B, vì nó phải là). Nhưng việc phân loại bị phá vỡ, vì bản ghi này phải ở ngay trước "Bonobo".
Bất kỳ ý tưởng nào về cách sửa lỗi này?
Bạn đã triển khai * cleanName * như thế nào? Nó có vẻ như một tài sản tạm thời cho thực thể sẽ là con đường để đi. – Huperniketes
Tôi khá chắc chắn các thuộc tính tạm thời không thể được sử dụng để sắp xếp trong NSFetchedResultsControllers. – samvermette