2011-11-09 27 views
24

Me estoy poniendo en práctica un UITableView con UISearchDisplayController en Xcode 4.2. UITableView & UISearchDisplayController se crean en la Historieta. puse el identificador de celda (SampleCell) para UITableView y acceder a ella comoios 5 UISearchDisplayController choque

cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"]; 

UITableView está trabajando muy bien. Pero una vez que trato de buscar, el accidente aplicación con errores a continuación.

*** Assertion failure in -[UISearchResultsTableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:6072 
2011-11-09 22:22:16.058 SampleApp[14362:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:' 

supongo que necesitan para establecer el identificador de celda para la celda self.searchDisplayController.searchResultsTableView. Pero no sé cómo. Gracias de antemano por cualquier ayuda. =)

+0

+1 para guardó mi tiempo para escribir un question.I enfrentaron exacta problema Sam. – thesummersign

Respuesta

16

error difícil de rastrear de hecho, parece que cada vez que se hace una búsqueda se crea un nuevo tableview. Lo que significa que su registro de celda debe ser retirado de ViewDidLoad ya que esto solo funcionará para la primera búsqueda. En lugar de utilizar el siguiente método delegado de hacer registro de células y personalización:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 
{ 
    [self.searchDisplayController.searchResultsTableView 
    registerNib:[UINib nibWithNibName:@"YOURCELLNIB" bundle:nil] forCellReuseIdentifier:@"YOURCELLID"]; 
    self.searchDisplayController.searchResultsTableView.separatorColor = [UIColor clearColor]; 
} 
+0

+1.Estaba lidiando con un problema muy similar y descubrí que una vez que eliminaba todas las llamadas a registerNib y las reemplazaba con un método diferente de cargar las células todo funcionaba bien. –

+0

¿Sabes cómo manejar t su ios5 con tablas compactas? Creé mi propia celda que amplía UITableView y seleccioné el estilo personalizado en el guión gráfico. Todo funciona bien, pero al filtrar la tablview, la celda en cellforrowatindexpath es siempre nula, así que me sale el error: además del error anterior, veo *** Aplicación de terminación debido a excepción no detectada 'NSInternalInconsistencyException', razón por la cual: 'UITableView dataSource debe devolver un celda de tableView: cellForRowAtIndexPath. ¿Cómo creo esa celda personalizada que creé en mi guión gráfico programáticamente? – imrank1

+0

Gracias, gracias, gracias !!! Esto me estaba volviendo loco, ya que tenía que registrar necesariamente una punta para las celdas searchResultsTableView, y poner el código en viewDidLoad era claramente incorrecto. Si pudiera volver a votar tu respuesta, ¡lo haría! –

83

Uso [self.tableView dequeue...], no [tableView dequeue...].

La célula que está tratando de quitar de la cola está vinculada a tableView de su controlador de vista principal en el guión gráfico, no el searchDisplayController 's de nueva creación tableView (que no tiene identificadores de celda vinculada a ella). Si sólo mensaje "tableView", entonces su mensaje de retirada de cola va a la searchDisplayController's tableView ya que eso es lo que se pasó al método ... cellForRowAtIndexPath:.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"]; 

    // do your thing 

    return cell; 
} 
+0

funciona como un encanto! ¡muchas gracias! – Anthony

+11

(+1) la respuesta debe ser aceptada. – thesummersign

+0

El nuevo problema es que el resultado de búsqueda se carga en un popover que no se desea. ¿Puedo de alguna manera usar mi propio ('self.tableView') para mostrar los resultados de búsqueda? – thesummersign

10

(La respuesta que se recomienda el uso de self.tableview es dependiente de otra vista de tabla. Esta es la solución más limpia y se puede utilizar incluso si el controlador de búsqueda se utiliza por sí mismo.)

Usted necesita registrar las celdas en UITableView de UISearchDisplayController. La mejor manera de hacerlo es registrar las celdas cuando se carga esa vista de tabla.

UISearchDisplayDelegate tiene un método que le avisa cuando la vista de tabla se carga - al igual que viewDidLoad pero para la vista de tabla de búsqueda.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView 
{ 
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"]; 
} 
+0

¡Esta es la mejor solución para evitar el bloqueo después de la primera carga! Es decir, si filtrara los _already_ datos recuperados, la otra forma funcionaría como se esperaba. Pero si uno pudiera hacer ** búsquedas remotas **, la vista de tabla del controlador de búsqueda, claramente no debería depender de la vista de tabla original. – Hulvej

+2

Muy útil. Vea también: 'registerClass: forCellReuseIdentifier:' si sus celdas están definidas en código en lugar de Interface Builder. – Nick

0

Usted puede en

- (void)searchDisplayController:(UISearchDisplayController *)searchDisplayController didLoadSearchResultsTableView:(UITableView *)searchResultsTableView

hacer

[searchResultsTableView registerNib:[UINib nibWithNibName:@"someNibName" bundle:nil] forCellReuseIdentifier:@"yourReuseId"];

Entonces usted es capaz de utilizar en

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

lo normal

[tableView dequeueReusableCellWithIdentifier: