2012-01-01 6 views
11

Sto tentando di creare uno UISearchDisplayController in modo programmatico. Ho un metodo che dovrebbe impostare il mio controller di ricerca, ma quando lo chiamo, non succede nulla.Creazione di un UISearchDisplayController a livello di codice

Questo il mio metodo -setupSearch:

- (void)setupSearch { 
    UISearchBar *myBar; 
    UISearchDisplayController *myCon; 

    myBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    [myBar sizeToFit]; 

    myCon = [[UISearchDisplayController alloc] 
      initWithSearchBar:myBar contentsController:self]; 
    [myBar release]; 

    myCon.delegate = self; 
    myCon.searchResultsDataSource = self; 
    myCon.searchResultsDelegate = self; 

    /* Setup scopes */ 
    { 
     NSMutableArray *scopes; 
     NSUInteger count, i; 
     NSString *aScope; 

     count = SCOPE_COUNT; 
     scopes = [[NSMutableArray alloc] initWithCapacity:count]; 
     for(i = 0; i < count; i++) { 
      // I create four scopes here 
     } 

     myCon.searchBar.scopeButtonTitles = scopes; 
     [scopes release]; 
    } 

    [myCon release]; 
} 

chiamo il metodo di cui sopra nel metodo della mia sottoclasse UITableViewController-viewDidLoad. Sfortunatamente non succede nulla quando il mio controller di visualizzazione tabella viene visualizzato in un UITabBarController.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

12

Partenza il codice di esempio in: [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

Repo qui: https://github.com/JayMarshal/Grabcasts

Si tratta di una versione ampliata del coredatatableviewcontroller dei corsi stanford iOS.

Rilevante frammento di quel codice segue:

- (void)createSearchBar { 
if (self.searchKey.length) { 
    if (self.tableView && !self.tableView.tableHeaderView) { 
     UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease]; 
     self.searchDisplayController 
       = [[UISearchDisplayController alloc] initWithSearchBar:searchBar 
                contentsController:self]; 
     self.searchDisplayController.searchResultsDelegate = self; 
     self.searchDisplayController.searchResultsDataSource = self; 
     self.searchDisplayController.delegate = self; 
     searchBar.frame = CGRectMake(0, 0, 0, 38); 
     self.tableView.tableHeaderView = searchBar; 
    } 
} else { 
    self.tableView.tableHeaderView = nil; 
} 

Fondamentalmente si attribuisce l'UISearchDisplayController all'auto (che deve essere una tableviewcontroller) come effetto collaterale della inizializzazione. Così l'impostazione:

self.searchDisplayController.searchResultsDelegate = self; 
self.searchDisplayController.searchResultsDataSource = self; 

Invece di

myCon.searchResultsDataSource = self; 
myCon.searchResultsDelegate = self; 

potrebbe fare il trucco. Nel debug, controlla se myCon e self.searchDisplayController puntano allo stesso oggetto?

Aggiornato: sembra che ci sia un bug nella proprietà SDC di TVC che non viene mantenuto nel runloop. Archiviato come: http://openradar.appspot.com/10254897 menzionato anche su SO, vedere UIViewController does not retain its programmatically-created UISearchDisplayController

+1

Dalla doc, il contentsController: "Questo è solitamente un'istanza della UITableViewController.". In genere, non richiesto. –

+0

Quindi, se non si desidera utilizzare un 'UITableViewController', si può semplicemente avere un' UIViewController' conforme ai protocolli 'UITableViewDataSource' e' UITableViewDelegate'. –

+6

Il mio problema è che 'self.searchDisplayController' è una proprietà readonly su' UITableViewController', eppure il codice qui lo sta impostando. –