UIViewController no conserva su UISearchDisplayController creado mediante progtwigción

En la documentation de UIViewController sobre la propiedad searchDisplayController 1 , dice:

Si crea su controller de pantalla de búsqueda mediante progtwigción, esta propiedad es configurada automáticamente por el controller de visualización 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 después de que finaliza el ciclo de evento, lo que hace que el controller de visualización de búsqueda no se muestre cuando toco dentro de la barra de búsqueda. Nada se cuelga. Esto es muy raro. Si autorelease la llamada a autorelease , todo funciona:

 [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 

Sin embargo, se UISearchDisplayController el UISearchDisplayController (lo comprobé con Instruments). Como la propiedad searchDisplayController está marcada como (nonatomic, retain, readonly) , espero que retenga el UISearchDisplayController después de configurarlo.

Este artículo stackoverflow está relacionado.

Me he topado con lo mismo. Creo todos mis controlleres / vistas mediante progtwigción. Todo funcionaba bien hasta que convertí mi proyecto para usar ARC. Una vez que hice el UISearchDisplayControllers ya no se retuvieron y la propiedad searchDisplayController en cada UIViewController fue nula después de que terminó el ciclo de ejecución.

No tengo una respuesta por qué esto está sucediendo. Los documentos de Apple sugieren que el SDC debe ser retenido por el controller de vista, pero esto claramente no está sucediendo.

Mi solución fue crear una segunda propiedad para conservar el SDC y cero cuando descargo la vista. Si no está utilizando ARC, debe liberar mySearchDisplayController en viewDidUnload y dealloc . De lo contrario, esto es bueno tal 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 } 

La solución anterior funciona bien, pero también encontré que puedes usar

 [self setValue:mySearchDisplayController forKey:@"searchDisplayController"] 

en el context de una subclass UIViewController .