7

Estoy trabajando en una aplicación de barra de pestañas y una de las pestañas tiene un UISearchDisplayController conectado a UISearchBar. Está todo conectado en el NIB y está funcionando. Cuando toco la barra de búsqueda, los botones Ámbito y Cancelar viajan, etc., y el delegado de búsqueda actualiza la tabla de resultados correctamente.UISearchDisplayController no funciona cuando se crea en el código?

Sin embargo, estoy tratando de implementar el mismo código en el mensaje viewDidLoad en lugar del NIB, sin embargo, cuando elimino el controlador de visualización de búsqueda del NIB y eliminé mi código para crear el mismo controlador en la función, no lo hace no funciona Es como si no se hiciera una conexión fundamental para que no se llame a toda mi funcionalidad de delegado de búsqueda.

Aquí está mi que funciona versión NIB del controlador de pantalla de búsqueda. Está conectado a la barra de búsqueda, la subclase UINavigationController (MASearchController) y la vista raíz de eso está conectada como searchContentsController.

alt text http://img192.imageshack.us/img192/3050/screenshot20100307at304.png

Ahora bien, esto es lo que se puede esperar que hacer en el código para crear el mismo, ¿verdad? Lo que estoy haciendo es dejar el UISearchBar en el NIB para eliminar una pieza del rompecabezas a la vez en el código.

// [MASearchController viewDidLoad] 
UISearchDisplayController *searchController = [[[UISearchDisplayController alloc] 
    initWithSearchBar:searchBar 
    contentsController:[[self viewControllers] objectAtIndex:0]] autorelease]; 
[searchController setDelegate:self]; 
[searchController setSearchResultsDelegate:self]; 
[searchController setSearchResultsDataSource:self]; 

He comprobado todos los objetos en tiempo de ejecución y todos ellos se echan un vistazo. Esencialmente eliminé el controlador de visualización de búsqueda del NIB y luego puse el código para crearlo en el mensaje viewDidLoad.

¿Por qué no funcionaría? Aparece el teclado de búsqueda, pero ninguna función de búsqueda y animación de botones funciona?

Respuesta

9

Wow, acabo de descubrir el problema.

que pensé, porque la propiedad searchDisplayController para la UIViewController se establece dentro de la initWithSearchBar: contentsController: mensaje que todavía AutoRelease mi copia del puntero, pero cuando me quité la autorelease la cosa estúpida comenzó a trabajar. Gaaaah. ¿Por qué no retendría su propia copia (el UIViewController)?

+0

Me encontré con el mismo problema. ¡Gracias por publicar esto! – DOOManiac

3

Normalmente, los objetos secundarios no deben retener sus elementos principales. En este caso, es el controlador principal que debe retener al hijo (que es el controlador de visualización de búsqueda).

Esto se ha hecho automáticamente cuando crea el SDC en archivo NIB porque se ha agregado a la propiedad searchDisplayController del controlador de vista y, por lo tanto, se conserva para la duración del controlador de vista.

Sin embargo, desde la configuración de la propiedad searchDisplayController en un controlador de vista es considered usage of private api. Solo debe agregar un ivar para retenerlo y liberarlo en dealloc manualmente.

la simple eliminación de la llamada autorelease es una pérdida de memoria a medida que estas dejando alrededor de un objeto que init -Ed sin guardar una referencia a él, así que no creo que es la respuesta correcta.

En su lugar, debe conservar el searchController correctamente en un ivar y liberarlo correctamente en dealloc como lo haría con cualquier objeto que desee mantener con vida durante toda la vida del controlador de vista.

Cuestiones relacionadas