El encabezado UITableView personalizado desaparece después de la advertencia de memory

Tengo un UITableViewController . Creo un headerView personalizado para su tableView en el método loadView así:

 (void)loadView { [super loadView]; UIView* containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height * 2 )]; containerView.tag = 'cont'; containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin; UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(padding, height, width, height); ... //configure UIButton and events UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"] highlightedImage:[UIImage imageNamed:@"highlight.png"]]; imageView.frame = CGRectMake(0, 0, width, height ); ... //configure UIImageView [containerView addSubview:button]; [containerView addSubview:imageView]; self.tableView.tableHeaderView = containerView; [imageView release]; [containerView release]; } 

Ninguno de los otros methods (viewDidLoad / Unload, etc.) está sobrecargado.

Este controller está alojado en una pestaña. Cuando cambio a otra pestaña y simulo una advertencia de memory, y luego vuelvo a esta pestaña, mi UITableView falta mi encabezado de custon. Todas las filas / sección son visibles como era de esperar. Al colocar una BP en el código loadView anterior, veo que se invoca cuando vuelvo a la pestaña después de la advertencia de memory y, sin embargo, no puedo ver el encabezado.

¿Alguna idea sobre lo que me falta aquí?

EDITAR: Esto sucede en el dispositivo y el simulador. En el dispositivo, acabo de dejar que se produzca una advertencia de memory al abrir un montón de aplicaciones diferentes mientras la mía está en segundo plano.

el método loadView no debería llamar super. Prueba eliminar [super loadView]; y eso bien puede resolver tu problema. Los otros methods de vista anulados (viewDidLoad, viewWillAppear, etc.) pueden llamar súper bien. Consulte la documentation en:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

para confirmacion.

Mantenga containView en lugar de liberarlo. Y devuélvalo en tableView: viewForHeaderInSection: (método UITableViewDelegate).

Tuve un problema similar a esto, aunque no parece explicar la situación de la OP basada en su código; Solo quiero ponerlo aquí en caso de que alguien más se tope con esto.

Conservo mi vista de encabezado en una variable de instancia. En mi vista, LoadLoad verifico si esta variable es nula, si es así, creo la vista, conservo y establezco la variable de instancia y establezco tableHeaderView . El problema es que esta condición solo será verdadera una vez, porque mi variable de instancia nunca será nula después de la primera vez que la creo; sin embargo, la propiedad tableHeaderView la vista de tableHeaderView se establecerá en cero cuando hay una advertencia de memory, por lo que ya no habrá una vista de encabezado, aunque todavía tenga la vista en una variable de instancia.

La solución era cambiar la verificación para ver si la propiedad tableHeaderView la vista de tabla es nula (y luego volver a crear la vista de encabezado cada vez que se establece en nil), o (dado que en este caso todavía tengo la vista retenida en una variable de instancia) para mover la asignación a tableHeaderView fuera del if-block, por lo tanto, cada vez que se ejecuta viewDidLoad , nos aseguraremos de volver a asignar la vista de encabezado a tableHeaderView en caso de que se haya establecido en nil.

¿Qué son el ancho y la altura? ¿Es posible que sean cero después de una advertencia de memory?

que es lo normal, el uso de iOS de esta manera para networkingucir la memory, mientras recibe un problema de memory, entonces liberará algún elemento de interfaz de usuario, que también invocará el método 'didUnLoad' … debe liberar headerView en el método 'didUnLoad' se establece en nil y luego en el método 'didLoad' para crear el headerView si es nil y luego agregarlo también a tableView …. iOS liberará automáticamente algunos elementos de la interfaz de usuario mientras se advierte la memory de la cara.

Me encontré con un problema similar que causaba que mi encabezado personalizado para la uitableview no se volviera a cargar después de recibir una advertencia de memory. mi implementación actual para crear el encabezado es

 - (void)viewDidLoad { [super viewDidLoad]; if (_tableHeaderView == nil) { [[NSBundle mainBundle] loadNibNamed:@"DetailHeaderView" owner:self options:nil]; self.tableView.tableHeaderView = _tableHeaderView; } } 

y para solucionar el problema, simplemente agregué esta línea a my didReceiveMemoryWarning

 _tableHeaderView = nil 

y ahora se vuelve a cargar después de que se envía una advertencia de memory.
Lo siento si esto ya ha sido respondido, pero no vi una respuesta clara para mi problema y pensé que iba a hacer clic aquí para cualquier otra persona en mi situación.

Happy Coding

Este problema es conocido. Por ejemplo, si usa TableViewDelegate tableView:viewForHeaderInSection: tampoco funcionará.

El problema es iOS y no tú. No hay muchas preguntas sobre tableHeaderView porque nadie lo usa, por lo que Apple no obtuvo ninguna input de BugTracker …

Echa un vistazo a una pregunta más antigua: aquí . Y aquí hay otros problemas.

Entonces, creo que es un error de SDK …

Hacer una reloadData en la vista de tabla puede ayudar

El único problema que puedo ver mirando solo su loadView es que está tratando de labelr su containerView con una cadena. Eso debería ser un NSInteger por lo que yo sé.