2012-04-13 4 views
2

Ich verwende eine UISearchBar mit zwei Bereichsschaltflächen. Ich möchte die Bereichsschaltflächen verwenden, um die Zeilen auch dann zu filtern, wenn kein Suchtext vorhanden ist. Im Moment werden die Zeilen nur gefiltert, wenn ein Suchtext vorhanden ist. Beim Debuggen wird angezeigt, dass die searchResultsTableView eine Framegröße von 0 hat.UISearchBar - Alle Zeilen anzeigen, wenn kein Suchtext vorhanden ist

Irgendwelche Ideen?

+0

jemals in der Lage, das herauszufinden? – Arbel

Antwort

0

Check this out ...

In ViewController.h Datei:

@interface ViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate> 
{ 
    UISearchBar *searchBar; 
    UISearchDisplayController *searchDisplayController; 
} 

@property (nonatomic, retain) NSArray *friendsArray; 
@property (nonatomic, retain) NSArray *searchResults; 

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

Und in ViewController.m Datei:

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 

     self.friendsArray = [[NSArray alloc]initWithObjects:@"Napoli",@"Juventus",@"Inter",@"Milan", @"Lazio",@"Real Madrid",@"Barcelona",@"Villareal",@"Valencia",@"Deportivo",@"Manchester City",@"Manchester United",@"Chelsea",@"Arsenal",@"Liverpool", nil]; 
     self.searchResults = [[NSArray alloc] init]; 

    } 
    return self; 
} 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 160, 44)]; 
    searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 

    searchDisplayController.delegate = self; 
    searchDisplayController.searchResultsDataSource = self; 

    self.tableView.tableHeaderView = searchBar; 

} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [self.searchResults count]; 

    } else { 
     return [self.friendsArray count]; 

    } 

} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell... 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row]; 
    } else { 
     cell.textLabel.text = [self.friendsArray objectAtIndex:indexPath.row]; 
    } 


    return cell; 
} 

#pragma mark - searchDisplayControllerDelegate 


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

    return YES; 
} 

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

    self.searchResults = [self.friendsArray filteredArrayUsingPredicate:resultPredicate]; 
} 
0

, das zu tun, sparen ein Array mit allen Daten. In textDidChange wenn searchText.length == 0 alle zeigen Kopie stattdessen das Array von Suchergebnissen

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

    if (searchText.length == 0) { 
     tableSource = [NSMutableArray arrayWithArray: self.homeSheets.data]; 
     [self.tableView reloadData]; 
     return; 
    } 

    ... 
}