Поиск в UITableView - NSInvalidArgumentException ошибка - PullRequest
1 голос
/ 02 апреля 2012

Я реализую панель поиска в UITableView (tblFriends) с помощью «панели поиска и контроллера поиска»

Это мой NSarray из словарей filterFriendsList (равный friendsList NSarray):

            {
        gender
        id
        name
        picture 

}

У меня есть табличное представление в UIViewController (не в tableViewController), потому что таблица занимает только половину представления.

Это код: ИНТЕРФЕЙС:

#import <UIKit/UIKit.h>
#import "ClasseSingleton.h"
#import "FBConnect.h"

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{

    NSArray *friendsList;
    NSDictionary *friendsDict;

    NSMutableArray *filteredFriendsList;

    IBOutlet UITableView *tblFriends;

}

@property (nonatomic, retain) NSArray *friendsList;
@property (nonatomic, retain) NSMutableArray *filteredFriendsList;

-(void)getFriends;


@end

РЕАЛИЗАЦИЯ

#import "ViewController.h"

@implementation ViewController

@synthesize friendsList, filteredFriendsList;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [tblFriends setDelegate:self];
    [tblFriends setDataSource:self];


}

- (void)getFriends{

    NSLog(@"ENTRATO - getFriends");

    //Copy ARRAY in other ARRAY
    friendsList = [NSArray arrayWithArray:[ClasseSingleton getFriends]];

    filteredFriendsList = [NSArray arrayWithArray:[ClasseSingleton getFriends]];


    NSLog(@"getFriends : DESCRIPTION\n\n %@", [friendsList description]);
    NSLog(@"Count friendslist: %i", [friendsList count]);

    [tblFriends reloadData];

}


//                  *****TABLE MANAGEMENT*****                 //


//Nuber of cells
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    NSLog(@"tabella1");
    return [filteredFriendsList count];


}

//Populate the table
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPat{

    static NSString * cellIdentifier = @"cell";

    //Set Style cell
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil){

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    }

    friendsDict = [filteredFriendsList objectAtIndex:indexPat.row];


    //Set CELL TEXT
    NSString *cellValue = [friendsDict objectForKey:@"name"];

    NSLog(@"TBL %@", cellValue);
    [cell.textLabel setText:cellValue];
    return cell;

}

//                          SEARCH IN TABLE

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{

    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)saearchBar {
    [self.filteredFriendsList removeAllObjects];
    [self.filteredFriendsList addObjectsFromArray: friendsList];
}


- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{

    /*
     Update the filtered array based on the search text and scope.
     */
    [self.filteredFriendsList removeAllObjects]; // First clear the filtered array.

    /*
     Search the main list for products whose type matches the scope (if selected) and whose name matches searchText; add items that match to the filtered array.
     */
    NSString *cellTitle;
    for (cellTitle in friendsList){
    //    for (cellTitle in [friendsDict objectForKey:@"name"]){    
        NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
        if (result == NSOrderedSame){
            [filteredFriendsList addObject:cellTitle];
        }
    }
}

...

@end

Каждый раз, когда я помещаю какой-либо символ в строку поиска, приложение вылетает с этой ошибкой:

«NSInvalidArgumentException», причина: «- [__ NSCFDictionary сравнивать: параметры: диапазон:]: нераспознанный селектор, отправленный на экземпляр

Я надеюсь решить проблему, это 6-й день с этой ошибкой.

Спасибо.

1 Ответ

4 голосов
/ 02 апреля 2012

Вы объявляете filteredFriendsList как NSMutableArray, но вы присваиваете ему неизменный NSArray здесь:

filteredFriendsList = [NSArray arrayWithArray:[ClasseSingleton getFriends]];

Измените это на:

filteredFriendsList = [NSMutableArray arrayWithArray:[ClasseSingleton getFriends]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...