Как я могу отсортировать и отфильтровать данные списков сразу? - PullRequest
2 голосов
/ 19 декабря 2011

Новичок в Objective-C здесь,

Я пытаюсь получить данные из списка, отфильтровать их, а затем отсортировать.Я использую метод сортировки ниже на других страницах, и он отлично работает.

Я получаю это предупреждение в строке, отмеченной ниже: Несовместимые типы указателей, присваиваемые 'NSMutableArray *' из 'NSArray *'

Iполучить эту ошибку:

2011-12-19 11:16:39.142 ATCScontacts[2511:707] -[__NSArrayI sortUsingDescriptors:]: unrecognized selector sent to instance 0x159cf0
2011-12-19 11:16:39.149 ATCScontacts[2511:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI sortUsingDescriptors:]: unrecognized selector sent to instance 0x159cf0'

Файл интерфейса:

#import <UIKit/UIKit.h>

@class customDetailViewController;
@interface contactsViewController : UITableViewController
{
    NSMutableArray *contacts_;
}

@property (nonatomic, retain) NSMutableArray* contacts;

Файл реализации:

- (void)viewDidLoad
{
    [super viewDidLoad];

//Load plist
    NSString *path = [[NSBundle mainBundle] pathForResource:@"contactD" ofType:@"plist"];
    contacts_ = [[NSMutableArray alloc]initWithContentsOfFile:path];

//Filter array using predicates
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS[cd] %@", "ABC", selection];

//ALERT DISPLAYS HERE:
    contacts_ = [contacts_ filteredArrayUsingPredicate:predicate];

//Apply sorting on load
    NSSortDescriptor *contactSorter = [[NSSortDescriptor alloc] initWithKey:LAST_KEY ascending:YES selector:@selector(caseInsensitiveCompare:)];
    [contacts_ sortUsingDescriptors:[NSArray arrayWithObject:contactSorter]];

    [contactSorter release];  
}

Справка!

Спасибо!Brian

1 Ответ

1 голос
/ 19 декабря 2011

Предупреждение появляется, потому что вы на самом деле пытаетесь присвоить NSArray * NSMutableArray ...

Чтобы решить эту проблему, получите изменяемую копию массива следующим образом:

[[contacts_ filteredArrayUsingPredicate:predicate] mutableCopy];

Но у вас все еще есть проблема с памятью, правильный путь будет:

NSArray *tmp = [contacts_ filteredArrayUsingPredicate:predicate];
[contacts_ removeAllObjects];
[contacts_ addObjectsFromArray:tmp];
...