6

En mi aplicación, cuando no estoy filtrando mi tabla, cuando toco en una celda, se aumenta su altura de cuadro para mostrar un UIProgressView que muestra el progreso de la descarga.¿Cómo controlar la vista de tabla de UISearchDisplayController?

Sin embargo, cuando filtró los datos del controlador de resultados obtenidos con un UISearchDisplayController, las celdas en esta vista de tabla filtrada no se comportan de la misma manera.

En su lugar, la celda no cambia de tamaño, no muestra la vista de progreso, no desencadena una descarga y la aplicación se bloquea posteriormente.

¿Cómo puedo obtener control sobre la vista de tabla que se presenta al filtrar los resultados con UISearchDisplayController?

EDITAR

Aquí es mi método -tableView:didSelectRowAtIndexPath:. Es un poco largo, pero la esencia es que funciona bien cuando no estoy buscando.

Creo que tengo que adaptar esto de alguna manera, para que pueda funcionar con cualquier controlador de resultados de vista de tabla/resultados que el controlador de resultados de búsqueda arroje a esto.

- (void) tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tv deselectRowAtIndexPath:indexPath animated:YES]; 

    if ([self.searchBar isFirstResponder]) 
     [self.searchBar resignFirstResponder]; 

    MyObject *_myObject = (MyObject *)[self.fetchedResultsController objectAtIndexPath:indexPath]; 

    if (self.isSimulatingFileHierarchy) 
    { 
     if ([_myObject isFolder]) 
     { 
      ObjectsViewController *_objectsViewController = [[ObjectsViewController alloc] initWithNibName:@"ObjectsViewController" bundle:nil]; 
      _objectsViewController.managedObjectContext = self.managedObjectContext; 
      _objectsViewController.nodeID = self.nodeID; 
      _objectsViewController.nodeName = self.nodeName; 
      _objectsViewController.parentObjectKey = [_myObject cleanedKey]; 

      if (self.parentObjectKey) 
       _objectsViewController.title = [[_myObject cleanedKey] stringByTrimmingPrefix:[self.parentObjectKey stringByAppendingString:@"/"]]; 
      else 
       _objectsViewController.title = [_myObject cleanedKey]; 

      [self.navigationController pushViewController:_objectsViewController animated:YES]; 
      UIBarButtonItem *_backButton = [[UIBarButtonItem alloc] initWithTitle:self.title style:UIBarButtonItemStyleDone target:nil action:nil]; 
      self.navigationItem.backBarButtonItem = _backButton; 
      [_backButton release]; 
      [_objectsViewController release]; 
     } 
     else { 
      // 
      // If we don't have data cached for this object, we add a request for the object's bytes to the objectRequestQueue 
      // 
      // 1. We add a progress indicator to the object's cell (we have an indexPath) 
      // 2. We store the data to the Documents folder 
      // 
      // Once we have the data, we push a ViewerViewController subclass that is specific to the object content type 
      // 

      if ((!_myObject.isDownloading) && ([_myObject.localPath length] == 0)) 
      { 
       if ([AwsObject objectContentSupportedForType:[_myObject.contentType intValue]]) 
       { 
        // 
        // Start request and redraw row with UIProgressView 
        // 
        [self triggerObjectRequestAdditionForObject:_myObject atIndexPath:indexPath]; 
       } 
       else { 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"ObjectsViewObjectRequestUnsupportedTypeAlertViewTitle", @"") message:NSLocalizedString(@"ObjectsViewObjectRequestUnsupportedTypeAlertViewMessage", @"") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"ObjectsViewObjectRequestUnsupportedTypeAlertViewContinue", @""), nil]; 
        [alert show]; 
        [alert release]; 
       } 
      } 
      else if ((_myObject.isDownloading) && ([_myObject.localPath length] == 0)) 
      { 
       // 
       // Cancel request and redraw row without progress view 
       // 
       [self triggerObjectRequestRemovalForObject:_myObject atIndexPath:indexPath]; 
      } 
      else if ((!_myObject.isDownloading) && ([_myObject.localPath length] != 0)) 
      { 
       // 
       // Launch viewer for supported MIME type 
       // 
       switch ([_myObject.contentType intValue]) { 
        case kObjectContentTypeApplicationMsword: { 
         [self pushWebViewerViewController:_myObject withTextEncoding:@"UTF-8"]; 
         break; 
        } 
        // handle other MIME types here... 
       } 
      } 
      else { 
       if ([_myObject isFolder]) { } 
       else { 
        if ((!_myObject.isDownloading) && ([_myObject.localPath length] == 0)) 
         [self triggerObjectRequestAdditionForObject:_myObject atIndexPath:indexPath]; 
        else if ((_myObject.isDownloading) && ([_myObject.localPath length] == 0)) 
         [self triggerObjectRequestRemovalForObject:_myObject atIndexPath:indexPath]; 
        else if ((!_myObject.isDownloading) && ([_myObject.localPath length] != 0)) { 
         switch ([_myObject.contentType intValue]) { 
          case kObjectContentTypeApplicationMsword: { 
           [self pushWebViewerViewController:_myObject withTextEncoding:@"UTF-8"]; 
           break; 
          } 
          // handle other MIME types here... 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Respuesta

12

En cualquiera de los métodos vista de tabla de delegado, puede detectar si se está trabajando con la vista de la tabla de la UISearchDisplayController utilizando la siguiente comprobación:

if (tableView == self.searchDisplayController.searchResultsTableView) { 
    // behavior specific to search display controller table view 
} 
else { 
    // behavior specific to the original, unfiltered table view 
} 
0

Normalmente, se comprueba si la vista de tabla que se pasa a tableView:didSelectRowAtIndexPath: es igual a un comportamiento alternativo "searchResultsTableView" y el programa de su controlador de pantalla de búsqueda para ese caso.

Parece que su problema puede ser más complicado. ¿Puedes publicar el código para tableView:didSelectRowAtIndexPath:?

Cuestiones relacionadas