在UITableView中搜索 - NSInvalidArgumentException错误

时间:2012-04-02 17:55:02

标签: objective-c ios xcode uitableview

我正在使用“SearchBar和搜索显示控制器”在UITableView(tblFriends)中实现搜索栏

这是我的字典的NSarray filteredFriendsList(等于friendsList NSarray):

            {
        gender
        id
        name
        picture 

}

我在UIViewController中有表视图(不在tableViewController中),因为该表只占用一半视图。

这是代码: INTERFACE:

#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 compare:options:range:]:无法识别的选择器发送到实例

我希望能解决这个问题,这是第6天出现此错误。

谢谢。

1 个答案:

答案 0 :(得分:4)

您声明filteredFriendsListNSMutableArray,但您在此处为其分配了一个不可告知的NSArray

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

将其更改为:

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