2012-04-06 4 views
1

ich nicht Suche arbeitet an einem UITableView bekommen. Ich habe die Delegierten etc. in der UITableViewController h-Datei deklariert:Ich kann nicht Suche auf einem UITableView Arbeit mit UISearchBar Kontrolle

@protocol searchTanksListDelegate 
- (void) searchTanksList:(UISearchBar *) sender textDidChange:(NSString *) searchText; 
@end 

@property (weak, nonatomic) id <searchTanksListDelegate> searchDelegate; 
@property (weak, nonatomic) IBOutlet UISearchBar *searchTanksList; 

ich die searchTanksList.delegate Selbst in der UITableViewController viewDidLoad Funktion.

und ich habe das Verfahren so umgesetzt:

- (void)searchTanksList:(UISearchBar *)searchTanksList textDidChange:(NSString *)searchText 
{ 
    if (searchText.length == 0) 
    { 
     self.isFiltered = false; 
    } 
    else { 
     self.isFiltered = true; 
     self.searchResults = [[NSMutableArray alloc] init]; 
     for (tank* thisTank in self.tanks) 
     { 
      NSRange nameRange = [thisTank.tankProduct rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      NSRange numberRange = [thisTank.tankNumber rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      NSRange productNumberRange = [thisTank.tankProductNumber rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      if (nameRange.location != NSNotFound || numberRange.location != NSNotFound || productNumberRange.location != NSNotFound) 
      { 
       [self.searchResults addObject:thisTank]; 
      } 
     } 
    } 
} 

Die Eigenschaften wurden usw. synthetisiert - so der Code kompiliert ohne Fehler oder Warnungen ... Die textDidChange Methode allerdings nicht heißt, wenn ich schreibe!

+0

Ich verstehe nicht, warum Menschen nicht ihre Protokolle zu NSObject bei der Deklaration .... – CodaFi

+1

Es tut mir leid - ich bin neu in der objektiven c/ios Entwicklung und verstehe nicht, was Sie sagen oder wie es hilft mir hier ...: o) – HillInHarwich

+0

es sollte sein: '@protocol searchTanksListDelegate ' – CodaFi

Antwort

4

Sie sollten nur die SearchBar als Eigenschaft erklären und sicherstellen, dass die Klasse ein UISearchBarDelegate eingestellt wird. Dann verwenden Sie die Delegate-Methode:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 

, um die Suche zu verarbeiten. Ich kann Ihnen ein vollständiges Beispiel schicken, wenn Sie brauchen.

Beispiel ein Array unter der Annahme ist, was Sie sind Filterung:

#pragma mark - SearchBar Delegate Methods 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{  
    [self filterContentForSearchText:searchText]; 
} 

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
{ 
    searchBar.text = @""; 

    workingTableViewData = [[NSMutableArray alloc] initWithArray:originalTableViewData]; 
    [self.myTableView reloadData]; 

    [searchBar resignFirstResponder];  
} 

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

- (void)filterContentForSearchText:(NSString *)searchText 
{ 
    if (searchText && searchText.length) { 
     [self.workingTableViewData removeAllObjects];  
     for (NSDictionary *dictionary in originalTableViewData) 
     { 
      for (NSString *thisKey in [dictionary allKeys]) { 
       if ([thisKey isEqualToString:@"Key1"] || 
         [thisKey isEqualToString:@"Key2"]) { 
        if ([[dictionary valueForKey:thisKey] rangeOfString:searchText options:NSCaseInsensitiveSearch].location != NSNotFound) { 
         [workingTableViewData addObject:dictionary]; 
        } 

       } // if ([thisKey isEqualToString:@"Key1"] || [thisKey isEqualToString:@"Key2"]) 

      } // for (NSString *thisKey in [dictionary allKeys]) 

     } // for (NSDictionary *dictionary in originalTableViewData) 

     [self.myTableView reloadData]; 

    } // if (searchText && searchText.length) 

} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [self filterContentForSearchText:searchBar.text]; 
    [searchBar resignFirstResponder]; 
} 

Hinweise - workingTableViewData und originalTableViewData sind sowohl private Eigenschaften. OriginalTableViewData ist ein NSArray und WorkingTableViewData ist ein NSMutableArray.

+0

Ja bitte !!! Ich dachte, das hätte ich getan! : -S – HillInHarwich

+0

Brilliant - danke. Ich ein bisschen bekam verwechseln mit dem die Delegierten zu erklären, Protokolle etc. Ich habe viel davon aus, zerrissen und jetzt funktioniert es, wie ich wollte! : o) danke dir. – HillInHarwich

+0

@ElJay Methode 'filterContentForSearchText:' muss Grand Central Dispatch verwenden, nicht wahr? Oder GCD-Konstruktion muss in 'searchBar: textDidChange:' Methode implementiert werden? Oder spielt es keine Rolle, wo es zu verwenden ist, das einzige Ziel ist es, Hauptthread zu vermeiden? –

Verwandte Themen