2012-01-01 13 views
11

Estoy tratando de crear un UISearchDisplayController mediante programación. Tengo un método que debe configurar mi controlador de búsqueda, pero cuando lo llamo, no pasa nada.Crear un UISearchDisplayController programmatically

Este -setupSearch mi método:

- (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]; 
} 

que llamo el método anterior en el método de mi subclase UITableViewController-viewDidLoad. Lamentablemente, no sucede nada cuando mi controlador de vista de tabla se muestra en un UITabBarController.

Cualquier ayuda sería muy apreciada.

Respuesta

12

Salida del código de ejemplo en: [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

Repo aquí: https://github.com/JayMarshal/Grabcasts

Es una versión ampliada de la coredatatableviewcontroller de los cursos de Stanford IOS.

fragmento pertinente de ese código sigue:

- (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; 
} 

Básicamente que concede la UISearchDisplayController a la libre (que debe ser un tableviewcontroller) como un efecto secundario de la inicialización. Por lo que establecer:

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

En lugar de

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

puede hacer el truco. En la depuración, verifique si myCon y self.searchDisplayController apuntan al mismo objeto.

Actualizado: parece que hay un error en la propiedad SDC del TVC que no se retiene en el runloop. Archivado como: http://openradar.appspot.com/10254897 también mencionado en SO, consulte UIViewController does not retain its programmatically-created UISearchDisplayController

+1

del documento, en el contenidoControlador: "Esto suele ser una instancia de UITableViewController". Típicamente, no requerido. –

+0

Así que si no quiere usar un 'UITableViewController', simplemente puede tener un' UIViewController' que se ajuste a los protocolos 'UITableViewDataSource' y' UITableViewDelegate'. –

+6

Mi problema con esto es que 'self.searchDisplayController' es una propiedad de solo lectura en' UITableViewController', y sin embargo el código aquí lo está configurando. –

Cuestiones relacionadas