UITableView, gestiamo le tabelle (Terza parte)

In quest’ultima parte dedicata alle tabelle vedremo come inserire  una searchbar per la   ricerca

1)Apriamo il nostro progetto tabelle e andiamo su RootViewController.xib

2)Selezioniamo dalla casella degli oggetti una Search Bar and Search Di- splay Controller

3)Allarghiamo la barra dove si trova il files’ owner e clicchiamo il pulsantino che sta in basso il risultato deve essere simile a questo :

4)inseriamo la Search Bar and Search Display Controller all’interno della tableview (in modo tale che apparirà in automatico all’interno della vista)

5)Andiamo sul file rootviewcontroller.h e inseriamo questo codice :


@interface RootViewController : UITableViewController{

NSMutableArray *lista;

NSMutableArray *filteredListContent;

}

@property (nonatomic, retain) NSMutableArray *lista;

@property (nonatomic, retain) NSMutableArray *filteredListContent;

@end

Non facciamo altro che inserire un altro nsmutablearrey

6)Implementiamo il codice andando su RootViewController.m


#import "RootViewController.h"

@implementation RootViewController

@synthesize lista,filteredListContent;

- (void)viewDidLoad {

[super viewDidLoad];

self.title = @"Elementi Pc";

lista = [[NSMutableArray alloc] initWithObjects: @"Ventola ", @"Ram",@"Hard disk", @"Scheda madre", @"Scheda video", @"Alimentatore", @"Periferiche", @"Processore", nil];

self.navigationItem.rightBarButtonItem = self.editButtonItem;

filteredListContent = [[NSMutableArray alloc] initWithCapacity:[lista count]];

[filteredListContent addObjectsFromArray: lista];

}

Abbiamo inserito due istruzioni nuove istruzione al vecchio codice già presente queste non fanno altro che inizializzare il nuovo array

7) ora dobbiamo modificare quest’altro metodo :


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

{

return [filteredListContent count];

}

8) modifichiamo quest’altro metodo :


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

{

return [filteredListContent count];

}

// Customize the appearance of table view cells.

- (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.

cell.textLabel.text = [filteredListContent objectAtIndex:indexPath.row];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

return cell;

}

8)Poi modifichiamo anche quest’altro metodo con questo codice :


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

if (editingStyle == UITableViewCellEditingStyleDelete)

{

NSLog(@"cancellato");

[lista removeObjectAtIndex:indexPath.row];//eliminiamo  lemento dalla lista

[filteredListContent removeObjectAtIndex:indexPath.row];

[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];

}

}

9) UN ultima modifica a un metodo già presente :


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

UIAlertView *popUp = [[UIAlertView alloc] initWithTitle:@"Hai selezionato:" message:[filteredListContent objectAtIndex:indexPath.row] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[popUp show];

[popUp release];

}

10)Ora non ci resta che implementare l’algoritmo per la ricerca :


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{

[self filterContentForSearchText:searchString scope: [[self.searchDisplayController.searchBar scopeButtonTitles]

objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

return  YES;

}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{

[self

filterContentForSearchText:[self.searchDisplayController.searchBar

text]scope:

[[self.searchDisplayController.searchBar scopeButtonTitles]

objectAtIndex:searchOption]];

return  YES;

}

Questi due metodi fanno parte del delegato  UISearchDisplayController , ora non ci resta di scrivere l’algoritmo vero e proprio :


- (void)filterContentForSearchText:(NSString*)searchText

scope:(NSString*)scope{

[self.filteredListContent removeAllObjects];

NSString *cellTitle;

for (cellTitle in lista){

NSComparisonResult result = [cellTitle compare:searchText

options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText

length])];

if (result == NSOrderedSame){

[filteredListContent addObject:cellTitle];

}

}

}

11)ora non ci resta che testare l’applicazione se tutto è andato bene il risultato finale dovrà essere così :

Scarica il progetto LINK