2011-05-26 15 views
6

Estoy usando el código siguiente en el controlador de vista raíz para ocultar el encabezado de UITableView (el encabezado tiene una barra UISearch). Funciona cuando la aplicación se inicia y muestra el tableView ... Sin embargo, luego, cuando se selecciona una fila, se presiona la vista de detalles y el usuario muestra la vista de detalles, el encabezado uitableview ya está visible en la vista raíz, que no es lo que esperaba.IOS UITableView contentOffSet ya no oculta el encabezado al volver de la vista de detalle presionada

He aquí las funciones relevantes:

- (void) viewWillAppear:(BOOL)animated { 
    [self.navigationController setNavigationBarHidden:YES animated:animated]; 
    [super viewWillAppear:animated]; 
    self.tableView.contentOffset 
    = CGPointMake(0, self.tableView.tableHeaderView.frame.size.height); 
    //it's as if the line above is ignored on when returning from a pushed detail view  
} 

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // theContentOffSet works when I put it hear, but then the user can see it which is not desired  
} 

La línea '[self.navigationController setNavigationBarHidden: SÍ animada: animado];' es sin duda parte del problema, ya que sin él, el código funciona y el encabezado tableView se desplaza fuera de la vista. Sin embargo, el requisito para la vista raíz es que la barra de navegación esté oculta, pero que se muestre en la vista de detalles.

Respuesta

16

Después de mirar por un tiempo, encontré la siguiente publicación https://devforums.apple.com/message/315519#315519 que resuelve este problema.

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self performSelector:@selector(updateContentOffset) withObject:nil afterDelay:0.0]; 
} 

- (void)updateContentOffset 
{ 
    self.tableView.contentOffset = CGPointMake(0, savedContentOffsetY); 
} 

Por supuesto, en viewWillDisappear puede guardar el contenido de compensación de la siguiente manera:

savedContentOffsetY = self.tableView.contentOffset.y; 

Y en su viewDidLoad,

savedContentOffsetY = self.tableView.tableHeaderView.frame.size.height; 
+1

la línea de código que tiene para viewDidLoad que debería ser 'savedContentOffsetY', ¿verdad? De lo contrario, este código se ve muy bien, lo aceptaré como la respuesta tan pronto como lo pruebe. – kris

+0

Buen descubrimiento, Kamchatka. Parece que 'performSelector' te permite superar algunos desafíos de sincronización con la animación que tienes con viewWillAppear – kris

+0

Gracias por capturar el error tipográfico, corregido ahora. – Kamchatka

1

Tengo buscar y traté mucho, pero nada ayuda . Finalmente el siguiente código me ayudó. Puede añadir el código en el que viewDidLoad método():

self.edgesForExtendedLayout = UIRectEdgeNone; 
Cuestiones relacionadas