Siamo giunti al terzo appuntamento riguardante le UITableView, ovvero le tabelle presenti nell’SDK per iPhone. Negli scorsi tutorial abbiamo visto come creare e popolare una tabella (Parte I) e come aggiungere alcune funzionalità, come la possibilità di editare (nel nostro caso cancellare) alcune celle e intercettare il tocco dell’utente (Parte II). In questa nuova parte vedremo, invece, come aggiungere una funzionalità molto importante: la ricerca.
1. Inseriamo la barra di ricerca
Facciamo doppio clic sul file “RootViewController.xib” per aprire IB, e inseriamo la nostra barra di ricerca. Anche in questo caso, grazie al firmware 3.0, sono state apportate delle migliorie nelle API che gestiscono la ricerca nelle tabelle. Dalla Libreria selezioniamo il componente “Search Bar and Search Display Controller” e trasciniamolo sopra l’elemento “Table View” che vedete nel Pannello dei documenti.

Se avete eseguito tutto correttamente la vostra tabella mostrerà ora anche una barra di ricerca:


Ancora una volta davvero tutto molto semplice!
Salvate tutto e chiudere Interface Buider.
2. Modifichiamo i metodi già esistenti
Prima di implementare la ricerca vera e propria, dobbiamo fare delle piccole modifiche ai metodi già presenti nel nostro progetto.
Iniziamo aprendo il file “RootViewController.h” e completiamo così la definizione della classe:
@interface RootViewController : UITableViewController {
NSMutableArray *lista;
NSMutableArray *filteredListContent;
}
@property (nonatomic, retain) NSMutableArray *lista;
@property (nonatomic, retain) NSMutableArray *filteredListContent;
@end
Abbiamo semplicemente dichiarato una nuova lista (riga 3), che conterrà gli elementi “filtrati”, ovvero quelli che corrispondono al criterio di ricerca.
Ora dobbiamo modificare i metodi che si occupano dell’inizializzazione della tabella. Iniziamo dal metodo “viewDidLoad” e dalla funzione “@synthetize”:
#import "RootViewController.h"
@implementation RootViewController
@synthesize lista, filteredListContent;
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Prodotti Apple";
//elementi da visualizzare nella tabella
lista = [[NSMutableArray alloc] initWithObjects:@"iPhone", @"iPod",
@"iPod Touch", @"iMac", @"iBook", @"MacBook", @"MacBook Pro", @"Mac Pro",
@"PowerBook", nil];
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
// crea la lista filtrata, inizializzandola con il numero di elementi dell'array "lista"
filteredListContent = [[NSMutableArray alloc] initWithCapacity: [lista count]];
//inserisce in questa nuova lista gli elementi della lista originale
[filteredListContent addObjectsFromArray: lista];
}
Come potete vedere la prima parte del metodo “viewDidLoad” è uguale a quella che già abbiamo scritto nei precedenti tutorial. Alle righe 21 e 23, invece, abbiamo definito due istruzioni, che hanno il compito di inizializzare il nuovo array, che ci servirà nell’algoritmo di ricerca. Inizialmente questa lista coinciderà con quella degli elementi iniziali, successivamente verrà modificata durante la digitazione dell’utente della stringa di ricerca.
Il secondo metodo da modificare è “numberOfRowsInSection”. Ecco il nuovo codice:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//il numero di righe deve corrispondere al numero di elementi della lista
return [filteredListContent count];
}
Questa modifica va eseguita in quanto la tabella ora non è più composta dagli elementi della lista originale, ma da quelli della lista filtrata, ovvero da quegli elementi selezionati mediante la ricerca. Ovviamente se l’utente non esegue nessuna ricerca, gli elementi della lista filtrata corrisponderanno agli elementi della lista originale.
Se vi è chiaro questo ragionamento, è facile intuire quali saranno i prossimi metodi da modificare: il primo è “cellForRowAtIndexPath:”, ovvero il metodo che si occupa di inserire i valori nelle celle. Modificate l’ultima istruzione al suo interno nella seguente maniera:
//inseriamo nella cello l'elemento della lista corrispondente
cell.textLabel.text = [filteredListContent objectAtIndex:indexPath.row];
Modifichiamo, poi, il metodo “commitEditingStyle” modificando l’istruzione presente alla riga 4:
//controlla se l'azione compiuta è un'eliminazione
if (editingStyle == UITableViewCellEditingStyleDelete) {
//elimina l'elemento dalla lista
[filteredListContent removeObjectAtIndex:indexPath.row];
//elimina le'elemento dalla tabella
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
L’ultimo metodo da modificare, infine, è “didSelectRowAtIndexPath:” e anche in questo caso l’unica modifica riguarda proprio la lista di riferimento:
// Se selezioniamo una riga appare un pop-up con l'elemento in questione
- (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];
}
Abbiamo così eseguito tutte le modifiche necessarie!
3. Implementiamo la ricerca
È arrivato il momento di implementare la ricerca vera e propria. Prima di mostrarvi i passaggi necessari, devo premettere che il codice non è stato scritto da me, ma l’ho preso da un esempio realizzato dalla stessa Apple. I commenti, quindi, saranno davvero pochi, anche perchè non è fondamentale capire come funziona tale algoritmo, in quanto lo stesso codice si può utilizzare in qualsiasi altra applicazione che necessiti di una ricerca.
Iniziate inserendo questi due metodi:
- (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;
}
I due metodi appena mostrati fanno parte del delegato “UISearchDisplayController”, che si occupa di gestire in maniera corretta la barra di ricerca.
Dobbiamo inserire, inoltre, un metodo che si occupa di reinserire tutti gli elementi originali nell’array filtrato quando l’utente annulla la ricerca. Per fare ciò ci serviremo del metodo “searchBarCancelButtonClicked”, che vieni richiamato proprio quando l’utente annulla la ricerca tramite il bottone “Cancel”:
- (void)searchBarCancelButtonClicked:(UISearchBar *)saearchBar {
[self.filteredListContent removeAllObjects];
[self.filteredListContent addObjectsFromArray: lista];
}
Senza questo metodo l’applicazione crasha quando si annulla una ricerca e si seleziona un elemento che è superiore al numero di elementi dell’ultima ricerca (grazie a Dario per la segnalazione e ad Andrea per la soluzione nei commenti).
Ora dobbiamo inserire l’algoritmo di ricerca vero e proprio. Eccovelo:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
/*
Update the filtered array based on the search text and scope.
*/
[self.filteredListContent 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 lista){
NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame){
[filteredListContent addObject:cellTitle];
}
}
}
Per questo algoritmo non voglio spendere parole, in quanto, come detto in precedenza, è stato scritto da Apple, quindi non posso permettermi di fare modifiche!
Cliccate ora su “Build and Go!”, se avete eseguito tutto correttamente si aprirà la vostra applicazione!










46 Responses to “T#041 – Usiamo le UITableView (parte 3): Implementiamo la barra di ricerca”
11 Maggio 2010
NeoOh bene.. cercavo proprio questo!! vediamo se riesco a far funzionare il tutto..
11 Maggio 2010
The AnonymousCiao, ma come si fa a mettere più righe sul sottotitolo?
l’ho visto su varie app ma non son mai riuscito a farlo… potete aiutarmi??
grazie
11 Maggio 2010
The Anonymous(ehm, si lo so che la domanda non c’entra niente con questo tutorial 🙂 però mi è venuta in mente qui….)
11 Maggio 2010
Staff devAPPNon ho ben capito cosa vuoi ottenere, ad ogni modo dai un’occhiata a questo tutorial:
http://www.devapp.it/wordpress/t015-celle-personalizzate-per-le-nostre-table.html
In questo modo potrai personalizzare le celle secondo le tue esigenze 😉
11 Maggio 2010
The Anonymousok grazie per la risposta ora guardo quello che mi hai linkato.. cmq quello che intendevo dire è questo:
hai presente le tabelle che hanno il titolo e il sottotitolo, no? tu puoi settare il valore del titolo con il metodo setText e il valore del sottotitolo con il metodo setDetailText… però cosi facendo avrai una sola riga per il titolo e una sola riga per il sotttotitolo… ma io ho visto varie app in cui il sottotitolo comprende più di una riga….. cioè ogni cella ha 3 righe (una per il titolo e 2 per il sottotitolo)
11 Maggio 2010
Andrea Busisi, allora devi proprio usare delle celle personalizzate, con la guida che ti hanno linkato sopra 😉
11 Maggio 2010
Luca AulettaCiao, vorrei fare di nuovo la mia precedente richiesta ma essendo più preciso ^___^ :
Allora potreste fare un tutorial per gestire le UITableView da un file plist? e poi anche come si crea un file plist? Grazie mille
11 Maggio 2010
Fastprova a guardare questo, però ti fa creare una sola riga di sottotitolo
11 Maggio 2010
Fasthttp://www.devapp.it/wordpress/t020-creiamo-table-view-raggruppate-e-divise-in-sezioni.html
27 Maggio 2010
bernardissimoSalve a tutti mi chiedevo se esistesse un algoritmo di ricerca che che permettesse di considerare anche il pattern contentuto i un cella;
mi spiego meglio
Ricerca : Pro
Rislutati:
Mac Book Pro
Pro Tools
Mac Pro
Prosessional
27 Maggio 2010
Andrea Busiciao, certamente, puoi farlo cambiando il metodo di ricerca in “filterContentForSearchText”..
Prova ad inserire questo codice al posto di quello presente:
for (NSMutableDictionary *elemento in lista){ NSRange textRange =[[[elemento objectForKey:@"voce"] lowercaseString] rangeOfString:[searchText lowercaseString]]; if(textRange.location != NSNotFound){ [self.filteredListContent addObject:elemento]; } }vedrai che ottieni quello che ti serve 😉
12 Giugno 2010
LeleCiao, mi stavo cimentando a sviluppare una barra di ricerca, tanto per divertirmi, ed ho avuto dei problemi, ovvero il codice non mi compilava…notando ho visto che il mio xcode (3.1.2 versione ormai vecchia) ha solo la UISearchBAr. Per queste guide che xcode utilizzate? Io alla fine ho risolto implementando un metodo della classe delegata (UISearchBarDelegate) il metodo e’ searchBar:textDidChange: , alla fine grazie anche al mio errore ho studiato un po’ 🙂 ciao
20 Agosto 2010
IvanCiao, ho forse scovato un errore che però mi è stato utilissimo per imparare a conoscere il debugger.
Se appena si apre l’app si cancellano delle righe non c’è nessun problema.
Se si effettua una ricerca e si torna indietro per eliminare una riga l’app va in crash.
Ho capito che accade perchè il filteredListContent assume il numero degli elementi pari alla ricerca che è stata effettuata. Quindi quando poi si va ad eliminare una riga l’app va a contare quanti elementi ci sono nel filteredListContent per popolare nuovamente la tabella che non corrispondono.
Spero vi possa essere di aiuto!!
Buona serata!
15 Settembre 2010
GianlucaCiao a tutti. Questo tutorial è stato utilissimo. Spero di vedere presto pubblicato un tutorial su come impostare una pagina che mostri “cose” a seconda della riga che si tocca e su come creare una pagina “about”.
La mia domanda però è questa: ho provato a seguire questo tutorial (tutte e tre le parti) e funziona tutto, ma se provo a implementarlo con quello su come creare una Table View divisa in sezioni (http://www.devapp.it/wordpress/t020-creiamo-table-view-raggruppate-e-divise-in-sezioni.html) l’app crasha. Come posso fare a risolvere il problema?
28 Settembre 2010
DaniloHo riscontrato un problema quando chiudo l’applicazione, in debug sul simulatore, e poi la faccio ripartire l’app va in crash nel punto [filteredListContent addObjectsFromArray: lista] e altre volte in removeAllObjects.
1 Ottobre 2010
Andrea Busise utilizzi le sezioni prima di eseguire una cancellazione devi controllare su quale sezione sta lavorando l’utente e cancellare l’elemento corrispondente, nella lista corretta..
questo problema mi è nuovo, stai lavorando su iOS 4? potrebbe dipendere dal multitasking, che non chiude completamente l’app, ma la lascia in background, con i dati modificati..
11 Ottobre 2010
JerryCiao, complimenti per il sito e per le ottime guide!
mi sono costruito solo da codice senza uso di IB un’applicazione, in una sezione di una TabBar ho una tableview dove mostro tutti gli elementi del mio database e vorrei implementare una barra di ricerca, però il problema è che provando ad inserire dal viewDidLoad del Controller della tabella una cosa del tipo:
UISearchBar *mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, 45)];
mySearchBar.delegate = self;
mySearchBar.showsCancelButton = YES;
mySearchBar.barStyle=UIBarStyleBlackOpaque;
mySearchBar.placeholder=@”Enter Name or Phone Number”;
mySearchBar.keyboardType=UIKeyboardTypeNamePhonePad;
[self.view addSubview: mySearchBar];
Mi appare la barra di ricerca per metà perchè sopra viene messo la barra di header della tabella, poi sotto di un livello la searchbar e sotto ancora la tabella….
Qualche dritta? Grazie
8 Novembre 2010
Gabryottimo tutorial. io ho implementato i metodi ma il problema è che la ricerca è diciamo in tempo reale. ovvero per ogni carattere messo effettua la ricerca. e questo mi rallenta moltissimo la app. c’è un modo di far partire la ricerca cliccando il tasto “cerca”?
p.s. la mia search bar ha gli scope button.
8 Dicembre 2010
DanyCiao, grazie per il tutorial!
sto provando a inserirlo nel mio progetto in cui ho una UIView ed al suo interno la TableView.
Ho seguito tutti i passaggi ma non mi mostra la SearchBar.
Cosa posso fare?
16 Dicembre 2010
AndyCiao mi dispiace ma non trovo questo articolo utile, se non come blando punto di partenza.
Sarebbe utile, in tutorial come questi, spiegare per esempio lo scopo delle funzioni implementate dal delegato, entrare nei dettagli in modo un pò più diretto.
Che differenza c’è tra le due funzioni del protocollo UISearchDisplayController delel quali parli ? scrivere solo:
“I due metodi appena mostrati fanno parte del delegato “UISearchDisplayController”, che si occupa di gestire in maniera corretta la barra di ricerca.”
Mi sembra solo un insieme di copia e incolla di codice che non riesce a dare valore aggiunto a quanto posso reperire dalla documentazione.
(non prendetela come una critica fatta con cattiverie … ma come un commento negativo per cercare di darvi un consiglio)
16 Dicembre 2010
AndyVorrei evitare di lasciare solo un commento fine a se stesso perchè suonava veramente male 🙂
In realtà la seconda funzione del protocollo :
shouldReloadTableForSearchScope
E’ inutile in questo caso, perchè non c’è nessuno scope.
Nell’esempio di apple i prodotti hanno titolo e tipologia e lo scope serve per filtrare per tipologia, quindi la seconda funzione si opccupa di lanciare l’aggiornamento della tabella in base allo scope selezionato.
E’ in quel punto che mi sono perso…. nel vostro esempio invece lo scope non è valorizzato e quindi non viene mai chiamata la seconda funzione.
14 Febbraio 2011
fabriciao a tutti e grazie mille per gli ottimi tutorial
mi rivolgo a voi perchè da novellino ho un problemino e non riesco risolverlo. Premetto che nelle prime due parti del tutorial non ho avuto grossi problemi, ma ora che devo implementare la ricerca ho il seguente problema:
quando clicco su build and run l’app parte ma quando scrivo una lettera nella search bar l’app và in crash
qualcuno ha avuto il mio stesso problema?
grazie in anticipo
15 Febbraio 2011
DarioLa barra di ricerca scorre insieme alle righe della tabella.
Come si potrebbe bloccare in alto sulla barra, lasciando scorrere solo le righe della tabllea?
Grazie
16 Febbraio 2011
fabriragazzi, oggi ho rifatto il progetto da capo e funziona 🙂
avevo dimenticato una stringa .. errori da pivello
ringrazio tutti anche se nessuno mi ha risposto 🙁
16 Febbraio 2011
Andrea Businon dovresti utilizzare un componente “Search Bar and Search Display Controller” come è stato detto nel tutorial, ma una tabella e una “Search Bar” divisa, posta sotto la navigation bar.. in questo modo la tabella scorre e la barra resta fissa 😉
15 Marzo 2011
DarioCiao,
ho implemetato la ricerca e funziona.
Penso però che ci sia un problema nel caso di altre subview collegate alle righe della table.
Se si effettua una ricerca, tap sulla riga, apre la subview, ritorno sulla table. annullo la ricerca, le successive righe (se selezionate) puntano all’elenco filtrato che non contiene di nuovo tutti gli elementi, e se si finisce fuori dall’indice va in crash, o in alternativa, apre una subview riferita nuovamente all’elenco filtrato.
Per ora non ho ancora una soluzione…
Ciao
15 Marzo 2011
DarioAnche con il vostro esempio c’è lo stesso problema, infatti annullando la ricerca e poi selezionando una cella, l’alert mostra ancora le righe dell’array filtrato.
Andrea se ci sei, batti un colpo…
Ciao
18 Marzo 2011
AndreaCiao Dario,
io ho risolto utilizzando il metodo:
– (void)searchBarCancelButtonClicked:(UISearchBar *)saearchBar {}
che ti fa sapere quando l’utente preme il bottone cancel nella barra di ricerca.
All’interno di questo metodo svuota l’array filtro e ricopiaci l’array datasource.
Un saluto,
Andrea
21 Marzo 2011
Andrea BusiHo corretto il problema segnalato da Dario, ringrazio Andrea per la soluzione proposta (e perfettamente funzionante).
Articolo e progetto aggiornati 😉
24 Marzo 2011
DarioDeduco che non siete lo stesso Andrea…
Grazie comuque
Per la soluzione di Andrea
Per gli ottimi tutorial di Mr.Busi
Ciao!
25 Marzo 2011
davideCiao Andrea,
complimenti per il sito e il tuo libro.
Ho sviluppato una applicazione che contiene una tabella con delle row, ogni row contiene anche una immagine associata al testo che contiene la row (es immagine: mela e testo:mela), inoltre ogni row è collegata ad una altra pagina attinente al testo della row.
il mio problema è che se implemento la barra di ricerca avviene la “dissociazione” tra il testo e l’immagine della singola row.
esempio:
row1 immagine mela, testo mela
row2 immagine melograno, testo melograno
row3 immagine mondo, testo mondo
se io ricerco “m” tutto a posto, se ricerco “mo”
mi da una riga con il testo mondo e l’immagine mela della row 1.
Altro problema:
se dopo la ricerca “mo” provo ad aprire la row con il testo ricercato (e che ho associato ad una altra nib) si apre sempre la nib collegata solo alla posizione della row nella tabella indipendemente dal testo contenuto nella row.
1) Come posso fare per tenere “unite” il testo e l’immagine delle row?
2) Come posso fare dopo la ricerca ad aprire esattamente la nib collegata al testo-immagine della row per la quale ho ricercato il testo?
Spero di essere stato il più chiaro possibile, ma sospratutto spero che tu abbia capito il mio problema e mi sappia suggerire una strada da seguire, magari con un esempio…
ciao e grazie in anticipo per la risposta
Davide
28 Marzo 2011
Andrea BusiIl primo problema non è difficile da risolvere, devi gestire bene testo e immagini.
Penso che tu ora abbia due liste (o qualcosa di simile), da cui ricavi testo e relativa immagine. Con la ricerca, però, vai a filtrare la lista del testo, mentre resta invariata quella delle immagini. Questa disparità provoca poi i problemi che hai descritto.
Per risolvere hai due soluzioni:
a) esegui il filtraggio anche nella lista delle immagini
b) ti crei una sola struttura con tutti i dati (ad esempio un NSDictionary), in modo che il filtraggio avviene su questa unica struttura e non hai più problemi.
Per il secondo problema, penso sia la stessa cosa del primo. Probabilmente tu hai un codice del genere:
Con la lista filtrata non puoi più eseguire un controllo così statico, ma dovrai eseguirlo sul reale contenuto della cella, altrimenti ti ritroverai anche in questo caso delle viste che non corrispondono alla cella selezionata.
Spero di essermi spiegato 😉
30 Marzo 2011
in cerca di miglioramentiCiao Andrea ho un problema. Ho creato una applicazione stile aroundMe che utilizza uitableview, mapkit ect…. Tutto funziona alla perfezione tranne una cosina che mi sta uccidendo. Ho implementato la barra di ricerca in una uitableview e tutto funziona. Quando clicco su una cella della tabella, filtrata per il criterio di ricerca scritto nei uisearchBar, l’applicativo mi zumma sulle coordinate dell’annotation corrispondente, l’UIViewController in cui è inserita la tabella scompare secondo il criterio dismismodal e fin qui tutto va bene. La cosa che proprio non capisco è che mi resta in vista solo la tabella a coprire parzialmente la mappa. Perchè succede questo?
Confido nella tua preparazione.
Ciao
10 Giugno 2011
Riccardo M.Ciao Andrea,
io ho un problema nei metodi UIsearchDisplayController in quanto al momento della compilazione mi da un
warning: ‘RootViewController’ may not respond to ‘-filterContentForSearchText:scope:’
Questo mi compila e avvia l’applicazione ma va in crash immediatamente.
Ho fatto come hai scritto, praticamente ho copiato e incollato il codice con i dovuti controlli ma non riesco a venirne a capo.
Quale potrebbe essere il problema?
15 Giugno 2011
seleCiao. Anche a me come sopra. Mi restituisce lo stesso
Warning – ‘RootViewController’ may not respond to ‘-filterContentForSearchText:scope:’
Nel mio caso ho inserito anche il codice per la ricerca che considerare anche il pattern contentuto i un cella: il simulatore si avvia, ma l’app crasha e si chiude appena digito una lettera nel campo di ricerca…che sbaglio??
17 Giugno 2011
Andrea Busiciao ragazzi, purtroppo detto così non riesco a capire dove sia l’errore. Ho provato a controllare il progetto allegato al tutorial ma funziona senza problemi. Riuscite a postarmi l’errore che vi viene restituito?
18 Luglio 2011
LucaAnch’io lo stesso problema!
…/R_SViewController.m: warning: Semantic Issue: Method ‘-filterContentForSearchText:scope:’ not found (return type defaults to ‘id’)
10 Agosto 2011
milonetciao, vi segnalo in problemino..
l’array contiene questi elementi: “mela”, “pera”,”banana”,”ciliegia”,”fragola”
appena apro la app mi visualizza correttamente il contenuto.. e fin qui tutto ok, la funzione cerca funziona tranquillamente.
il problema nasce da quando decido di eliminare un frutto.. tolgo ad esempio la mela;
nella ricerca continua ad apparire.. e non solo, mi sballa tutti gli indici.. se clicco sul frutto, il popup mi segnala che ho selezionato quello successivo ecc ecc..
avete per caso già risolto in qualche punto in cui non ho ancora visto?
grazie a tutti e complimenti per il mega lavoro che state facendo.. sto imparando tantissimo
10 Agosto 2011
milonetaltro problema.. se dai risultati filtrati elimino un record simulando lo slide del dito in modo da far comparire direttamente il tasto delete, mi cencella il record solo dai risultati filtrati mentre mi rimane nell’array principale.. riuscissimo a risolvere questi problemi potremmo prendere questo esempio utilissimo come punto ri riferimento per le nostre app..
ciauuu 😀
15 Agosto 2011
seleRISOLTO!
basta dichiarare il metodo (filterContentForSearchTex) con i paramtri nel file h. e non restituisce più alcun alert!!
30 Agosto 2011
MarcoPer tutti quelli che come me hanno la table view dentro una TabBar e non riescono a visualizzare la SearchBar seguite questa procedura.
1)cancellare completamente dallo .xib la SearchBar
2)inserire nel .h questi due delegati
e dichiarare sia la SearchBar che il SearchDisplay
UISearchBar *sBar;
UISearchDisplayController *sdc;
3)nel .m invece scrivere questa funzione in aggiunta a quelle già scritte sopra
-(void)loadView
{
[super loadView];
sBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,0,320,45)];
sBar.delegate = self;
[self.view addSubview:sBar];
sdc = [[UISearchDisplayController alloc] initWithSearchBar:sBar contentsController:self];
sdc.delegate = self;
sdc.searchResultsDataSource = self;
sdc.searchResultsDelegate = self;
}
per me ha funzionato, spero anche per voi 🙂
30 Agosto 2011
Marcoi delegati sopra sono
“UISearchBarDelegate,UISearchDisplayDelegate”
scusate se non me li ha visualizzati 😀
30 Agosto 2011
LucaNon ho capito cosa intendi!!!
Posta la dichiarazione del metodo!
31 Agosto 2011
LucaSi risolve così:
il .h va messo così
@interface RootViewController : UITableViewController {
NSMutableArray *lista;
NSMutableArray *filteredListContent;
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope;
@property (nonatomic, retain) NSMutableArray *lista;
@property (nonatomic, retain) NSMutableArray *filteredListContent;
@end
6 Settembre 2011
DanySalve, ottimo tutorial!
Il mio obiettivo è fare una ricerca in remoto quindi non ho bisogno di filtrare i risultati.
Ho implementato tutto solo che non riesco a fare il dismiss della searchbar così come accade quando uno clicca il bottone cancel!
In pratica quando uno cerca viene nascosta la navigazion bar e viene visualizzata nuovamente solo quando clicchi su cancel! Come si ottiene quell’effetto quando clicco sul bottone del cerca?
6 Settembre 2011
DanyOk Fatto! Se dovesse servire a qualcuno il metodo che ho usato è questo [self.searchDisplayController setActive:NO animated:YES];