ios uiviewcontroller automatic-ref-counting uisearchdisplaycontroller

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 }