2010-09-26 1621 views

Respuesta

14

Si, como yo, cree que el TableView normal era demasiado feo, también puede abandonar el uso de SearchDisplayController.

acabo:

  • insertado en un vacío Ver un SearchBar y una TableView ya que normalmente no para IBOutlet
  • seleccionado propietario del de archivo como delegado para los dos.
  • Al principio, el número de sección es 0 ([myTab count]) luego utilicé reloadData y esta vez myTab se completa con el resultado.
  • [self.resultTableView reloadData];

Aquí puede encontrar toda la método que utiliza de los delegados

@interface MyViewController : UIViewController <UIApplicationDelegate, UISearchBarDelegate> { 

    IBOutlet UISearchBar *searchBar; 
    IBOutlet UITableView *resultTableView; 
} 

@property (nonatomic, retain) IBOutlet UISearchBar *searchBar; 
@property (nonatomic, retain) IBOutlet UITableView *resultTableView; 

    //For your searchBar the 2 most important methods are 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBarClicked; 
- (BOOL)searchBarTextDidEndEditing; 


    //For your TableView the most important methods are in my case: 

    //number of sections in the table view. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
    //HEADERS 
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
    //different numbers of row by section 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
    //the cells themselves 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

@end 

Después de todo, la solución más sencilla es a menudo la mejor ...

+1

Esta es una gran idea y realmente simplificó el uso de una búsqueda barra en mi aplicación. ¡Gracias! – Luke

0

Esto no es posible ya que la propiedad searchResultsTableView es readonly.

+0

así que básicamente no hay absolutamente ninguna manera de cambiarlo a un estilo agrupados? es absurdo que Apple nos abstenga de hacer tal cosa ... – Noam

+0

@David, sé que apesta. :( –

1

Se podría tratar de crear una subclase de UISearchDisplayController y hacer búsquedas searchResultsTableView

en cualquier archivo .h complemento:

@interface YourUISearchDisplayController : UISearchDisplayController { 
    UITableView * searchResultsTableView; 
} 

@property (nonatomic) UITableView * searchResultsTableView; 

@end; 

Entonces sólo tiene que utilizar YourUISearchDisplayController lugar desde UISearchDisplayController.

Nota: es posible que tenga que usar (no atómico, retener), (no atómico, asignar) o (no atómico, copiar). Realmente no estoy seguro

+0

"A continuación, sólo tiene que utilizar en lugar de YourUISearchDisplayController UISearchDisplayController" Así que esto es lo que hice: myUISearchDisplayController = [[alloc MyUISearchDisplayController] initWithStyle: UITableViewStyleGrouped]; \t self.searchDisplayController.searchResultsTableView = myUISearchDisplayController.searchResultsTableView; Pero me da el error de que "/RootViewController.m:472: error: el objeto no se puede establecer, ya sea propiedad de solo lectura o no se encontró el colocador " ¿Hay algún problema? – Noam

+0

@David, no creo que sea posible para anular propiedades en Objective-C, solo es posible anular ** métodos **. –

+0

Sí Parece que no tienes suerte. Resulta que incluso si escribe setters para propiedades de solo lectura, simplemente siguen llamándose a sí mismos. –

0

Anulación -searchResultsTableView no va a funcionar, porque UISearchDisplayController accede directamente a su variable de instancia de la vista de tabla, sin llamar al método. El inicializador designado para UISearchDisplayController parece ser un método privado, -initWithSearchBar:contentsController:searchResultsTableViewStyle:, que establece la variable de instancia _searchResultsTableViewStyle. Esta variable de instancia se usa para crear la vista de tabla de resultados de búsqueda. El inicializador público llama a este método, pasando UITableViewStylePlain.

llamando directamente el inicializador designado privada o establecer la variable de instancia es probable obtener una solicitud rechazada de la App Store, por lo que en su lugar puede tratar de anular el inicializador pública y llamando

[self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"searchResultsTableViewStyle"]; 
3

Esto funciona para mí:

Crear una clase que se extiende UISearchDisplayController:

@interface RVSearchDisplayController : UISearchDisplayController 
@end 

@implementation RVSearchDisplayController 

-(UITableView *) searchResultsTableView { 
    [self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
      forKey:@"_searchResultsTableViewStyle"]; 
    return [super searchResultsTableView]; 
} 

@end 

continuación, agregar un UISearchDisplayController a su mesa usando IB, y cambie su Clase personalizada al RVSearchDisplayController en el Inspector de identidad.

+3

¿Eso cuenta como usar una api privada? – chakrit

15

Esto funcionó para mí (iOS 5.0):

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 
[self.searchController setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"_searchResultsTableViewStyle"]; 
+0

Esa es en realidad la mejor solución en esta publicación. ¡GRACIAS! – jcdmb

+0

Esto también funciona para mí, iOS 5.1 – jxdwinter

+6

'_searchResultsTableViewStyle' no parece estar documentado ... ¿Esto pasará la aprobación de Apple? –

Cuestiones relacionadas