2012-02-06 138 views
0

使用核心數據,數據正在被正確提取並正確顯示,問題在於搜索不會過濾搜索結果,無論我在搜索欄中輸入什麼,它都會顯示相同的表格視圖在篩選出的結果相同的數據..核心數據搜索問題iOS 5

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    if (context == nil) 
    { 
     context = [(VektorAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }  
    app = [[UIApplication sharedApplication] delegate]; 

    [self getData]; 

    // create a filtered list that will contain products for the search results table. 

    filteredListItems = [[NSMutableArray alloc] initWithCapacity:[self.plateNumbers count]]; 

    // restore search settings if they were saved in didReceiveMemoryWarning. 
    if (self.savedSearchTerm){ 
     [self.searchDisplayController setActive:self.searchWasActive]; 
     [self.searchDisplayController.searchBar setSelectedScopeButtonIndex:self.savedScopeButtonIndex]; 
     [self.searchDisplayController.searchBar setText:savedSearchTerm]; 

    self.savedSearchTerm = nil; 
    } 
} 

擷取來自核心數據的數據:

-(void)getData { 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Favouritesdata" inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

[request setFetchBatchSize:20]; 

[request setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"licenseplate" ascending:NO]; 

NSArray *newArray = [[NSArray alloc]initWithObjects:sort, nil]; 

[request setSortDescriptors:newArray]; 

NSLog(@"newArray: %@", newArray); 

NSError *error; 

results = [[context executeFetchRequest:request error:&error] mutableCopy]; 

plateNumbers = [results valueForKey:@"licenseplate"]; 

NSLog(@"plateNumbers: %@", plateNumbers); 

[self setLicensePlateArray:results]; 

[self.favouritesTable reloadData]; 

} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
if (tableView == favouritesTable) { 
    return [licensePlateArray count]; 
} else { // handle search results table view 
    return [filteredListItems count]; 
    }  
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

if (tableView == favouritesTable) { 
    cellValue = [licensePlateArray objectAtIndex:indexPath.row]; 
} else { // handle search results table view 
    cellValue = [filteredListItems objectAtIndex:indexPath.row]; 
} 

static NSString *CellIdentifier = @"vlCell"; 

VehicleListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 

    NSLog(@"Cell Created"); 

    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"VehicleListCell" owner:nil options:nil]; 

    for (id currentObject in nibObjects) { 
     if ([currentObject isKindOfClass:[VehicleListCell class]]) { 
      cell = (VehicleListCell *)currentObject; 
     } 
    } 
    NSInteger cellVal = indexPath.row; 

    NSLog(@"indexPath.row: %i", cellVal); 

    UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)]; 
    pressRecongnizer.delegate = self; 
    pressRecongnizer.minimumPressDuration = 0.5f; 
    [cell addGestureRecognizer:pressRecongnizer]; 
    [pressRecongnizer release]; 
} 

cell.textLabel.font = [UIFont systemFontOfSize:10]; 

Favouritesdata *favdata = [results objectAtIndex:indexPath.row]; 

cell.licPlate.text = [favdata licenseplate]; 

NSLog(@"cellvalue for cellforRow: %@", cell.licPlate.text); 

return cell; 
} 

搜索欄實現:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{  
    NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"SELF contains[cd] %@", 
            searchText]; 

    self.filteredListItems = [self.plateNumbers filteredArrayUsingPredicate:resultPredicate]; 

} 

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

    if ([[searchString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]) 
     self.favouritesTable = controller.searchResultsTableView; 

    return YES; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { 
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]]; 
    return YES; 
} 

如何解決此問題?

+0

你缺少爲你設置一個NSPredicate請求 – CarlJ 2012-02-06 12:29:01

+0

如何以及在哪裏設置它? – 2012-02-06 12:30:47

+0

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html#//apple_ref/doc/uid/TP40002484-SW1 – CarlJ 2012-02-06 12:32:30

回答

0

只要在代碼清晰並定義每個方法之前,您只需設置謂詞,而不是爲其啓動查詢。

只是做出單獨的方法,只是將搜索文本作爲參數傳遞給該方法以進行謂詞和取消查詢,然後重新載入表。

+0

但我沒有得到設置在哪裏謂詞,在filterContentForSearchText中:已經設置了一個謂詞。 – 2012-02-06 13:46:17