ios - UIViewController no conserva su UISearchDisplayController creado mediante programación
automatic-ref-counting (2)
En la documentation UIViewController
sobre la propiedad searchDisplayController
documentation dice:
Si crea su controlador de pantalla de búsqueda mediante programación, esta propiedad se establece automáticamente por el controlador de pantalla de búsqueda cuando se inicializa.
Y cuando creo mi UISearchDisplayController así:
[[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self] autorelease];
-[UIViewController searchDisplayController]
no es nil
. Sin embargo, se completa cuando finaliza el bucle de eventos, lo que hace que el controlador de la pantalla de búsqueda no se muestre cuando toco dentro de la barra de búsqueda. Nada se estrella. Esto es muy raro. Si autorelease
la llamada a autorelease
, todo funciona:
[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
Sin embargo, se filtra el UISearchDisplayController
(verifiqué esto con los instrumentos). Dado que la documentation searchDisplayController
está marcada como (nonatomic, retain, readonly)
espero que retenga el UISearchDisplayController
vez que se haya establecido.
Este artículo de stackoverflow está relacionado.
La solución anterior funciona bien, pero también encontré que puedes usar
[self setValue:mySearchDisplayController forKey:@"searchDisplayController"]
en el contexto de una subclase UIViewController
.
Me he topado con lo mismo. Creo todos mis controladores / vistas mediante programación. Todo funcionaba bien hasta que convertí mi proyecto para usar ARC. Una vez que hice los UISearchDisplayControllers
ya no se retuvieron y la propiedad searchDisplayController
en cada UIViewController
fue nula después de que finalizó el ciclo de ejecución.
No tengo una respuesta por qué esto está sucediendo. Los documentos de Apple sugieren que el controlador de vista debería conservar la SDC, pero esto claramente no está sucediendo.
Mi solución fue crear una segunda propiedad para conservar el SDC y lo nulo cuando descargo la vista. Si no está utilizando ARC, debe liberar mySearchDisplayController
en viewDidUnload
y dealloc
. De lo contrario esto es bueno como es.
En MyViewController.h:
@property (nonatomic, strong) UISearchDisplayController * mySearchDisplayController;
En MyViewController.m:
@synthesize mySearchDisplayController = _mySearchDisplayController;
- (void)viewDidLoad
{
[super viewDidLoad];
// create searchBar
_mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
_mySearchDisplayController.delegate = self;
_mySearchDisplayController.searchResultsDataSource = self;
_mySearchDisplayController.searchResultsDelegate = self;
// other stuff
}
- (void)viewDidUnload
{
[super viewDidUnload];
_mySearchDisplayController = nil;
// other stuff
}