Como controlar a vista da tabela do UISearchDisplayController?
Pergunta
Na minha aplicação, quando não estou filtrando minha mesa, quando toco em uma célula, a altura da estrutura é aumentada para exibir um UIProgressView
Isso mostra o download do progresso.
No entanto, quando filtro os dados do controlador de resultados buscados com um UISearchDisplayController
, as células nesta exibição de tabela filtrada não se comportam da mesma maneira.
Em vez disso, a célula não redimensiona, não mostra a visualização de progresso, não aciona um download e o aplicativo trava posteriormente.
Como faço para obter controle sobre a vista da tabela que é apresentada ao filtrar os resultados com UISearchDisplayController
?
EDITAR
Aqui está o meu -tableView:didSelectRowAtIndexPath:
método. É um pouco longo, mas a essência é que funciona bem quando não estou pesquisando.
Eu acho que preciso adaptar isso de alguma forma, para que possa funcionar com o controlador de visualização / resultados de tabela de tabela que o controlador de resultados de pesquisa está jogando nisso.
- (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...
}
}
}
}
}
}
}
Solução
Em qualquer um dos métodos de delegados de exibição da tabela, você pode detectar se está trabalhando com a exibição da tabela do uisearchDisplayController usando a seguinte verificação:
if (tableView == self.searchDisplayController.searchResultsTableView) {
// behavior specific to search display controller table view
}
else {
// behavior specific to the original, unfiltered table view
}
Outras dicas
Normalmente, você verificaria se a visualização da tabela sendo passada para tableView:didSelectRowAtIndexPath:
é igual ao "SearchResultStableView" do seu controlador de pesquisa de pesquisa e programe o comportamento alternativo para esse caso.
Parece que seu problema pode ser mais complicado. Você pode postar o código para tableView:didSelectRowAtIndexPath:
?