2012-04-02 67 views
1

我执行在一个UITableView(tblFriends)搜索栏有“搜索栏和搜索显示控制器”搜索 - NSInvalidArgumentException错误

这是我的字典的NSArray filteredFriendsList(等于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 compare:options:range:]:无法识别的选择器发送到实例

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

谢谢。

回答

4

您声明filteredFriendsList是一个NSMutableArray,但你在这里分配的immuatble NSArray它:

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

它改成这样:

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

或'[ClasseSingleton getFriends] mutableCopy ]' – warrenm 2012-04-02 17:59:03

+0

:(现在有一个新的错误:'NSInvalidArgumentException',原因:' - [__ NSCFDictionary compare:options:range:]: – Byteros 2012-04-02 19:44:46

+0

这不是整个错误 – yuji 2012-04-02 19:53:38