ios objective-c uitableview uiview

ios - Cambiar el color de fondo en un UITableViewHeaderFooterView cargado desde un xib dice que use contentView.backgroundColor en su lugar



objective-c uiview (6)

Estoy creando un UITableViewHeaderFooterView a partir de un archivo xib , y casi todo funciona correctamente.

El problema es que ahora, cuando intento cambiar el color de fondo (o si tengo uno configurado en el xib), este mensaje se envía constantemente a la consola:

La configuración del color de fondo en UITableViewHeaderFooterView ha quedado en desuso. Por favor, use contentView.backgroundColor en su lugar.

Esto significa que tengo dos problemas:

  • Si no quiero ver esa advertencia, debo deshacerme del color de fondo en el archivo xib (esto no es deseable porque significa que mi xib ya no refleja cómo se verá la vista en el tiempo de ejecución).
  • Cuando intento cambiar el color de fondo a través del código, recibo la sugerencia contentView.backgroundColor , pero cuando trato de seguir esa sugerencia, no sucede nada. (Esto se debe a que contentView es nil ).

Nota: Hay una pregunta similar aquí, pero que estaba principalmente relacionada con silenciar el mensaje, no encontrar una solución alternativa que resuelva los dos problemas anteriores.

Actualización: para que quede claro, quiero seguir usando un archivo xib para la vista del encabezado, y quiero poder llamar a dequeueReusableHeaderFooterViewWithIdentifier: para que la tabla pueda ser eficiente en la administración de las vistas.


La configuración del color de fondo en UITableViewHeaderFooterView ha quedado en desuso. Por favor, use contentView.backgroundColor en su lugar.

Esto puede suceder si diseñas tu encabezado en un archivo xib separado y configuras el fondo de la vista principal en ese lugar.

Para resolverlo, revierta el color de fondo UIView al color predeterminado en InterfaceBuilder, y establezca el color de fondo dentro del método de la sección viewForHeaderInSection :.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeaderXibFileName") as! CustomHeader header.contentView.backgroundColor = UIColor.blueColor }

Como ve, usamos header.contentView.backgroundColor y no header.backgroundColor (que es lo que realmente estaba haciendo el archivo xib).


¿Qué hay de usar el código para crear un encabezado personalizado y colocarlo?

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSinteger)section { UIView * myHeader = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 320, 40)]; [myHeader setBackgroundColor:[UIColor grayColor]]; UILabel * TitleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10, 5, 320, 20)]; TitleLabel.text = @"My Title"; [myHeader addSubview:TitleLabel]; return myHeader; }


Aquí está la mejor manera que he encontrado para resolver esto:

  1. Restablece el color de fondo de tu UITableViewHeaderFooterView a Predeterminado .
  2. Agregue una sola vista directamente debajo de la instancia de su UITableViewHeaderFooterView y UITableViewHeaderFooterView Vista de contenido . (Esto es exactamente lo que Apple hace con un UITableViewCell , y simplemente estamos imitando esa estructura).
  3. Ahora puede cambiar el color de fondo de la vista de contenido para que sea lo que desee en el archivo xib.
  4. Coloque cualquier otra vista inside la Content View .
  5. Redefina la propiedad contentView en un método de extensión y agregue IBOutlet a su definición. (Ver código abajo).
  6. Asocie la propiedad con la vista de contenido que creó, como lo haría con cualquier IBOutlet.
  7. Ahora puede cambiar el color de fondo usando contentView.backgroundColor en el código, tal como lo indica el mensaje de error.

archivo .h:

@interface ABCHeaderView : UITableViewHeaderFooterView @end

archivo .m:

@interface ABCHeaderView () @property (nonatomic, readwrite, retain) IBOutlet UIView *contentView; @end @implementation ABCHeaderView @synthesize contentView; @end

Esta jerarquía es consistente con la documentación de Apple :

Si tiene contenido personalizado para mostrar, cree las subvistas para su contenido y agréguelas a la vista en la propiedad contentView.


Establezca contentView.backgroundColor en la devolución de llamada de delegado willAppear:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section

o

- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section


Esto funciona para mí:

-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { UITableViewHeaderFooterView *headerView=(UITableViewHeaderFooterView *)view; [headerView.backgroundView setBackgroundColor:[[UIColor blackColor]colorWithAlphaComponent:0.4]]; }


Para deshacerse de la advertencia no debe establecer el color de fondo. El problema es que al crear TableHeader de esta manera, IB no proporciona un objeto especial para eso. Eliminar el color de fondo en el código fuente será excelente para resolver el problema descrito, solo con algunos clics.

  1. Encabezado .xib encontrado en Xcode
  2. Clic derecho - Abrir como -> Código fuente
  3. Encontrar la clave de color: Cmd-F - "backgr"
  4. Quitarlo En mi caso fue la línea: <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  5. Ahora puedes cambiar el fondo como:

    override func awakeFromNib() { backgroundView = UIView() backgroundView?.backgroundColor = UIColor.whiteColor() }