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

Estoy creando un UITableViewHeaderFooterView desde un file xib , y casi todo funciona correctamente.

El problema es que ahora cuando trato de cambiar el color de background (o si tenía uno configurado en el xib), este post se enviará constantemente a la console:

Configurar el color de background en UITableViewHeaderFooterView ha quedado en desuso. Utilice contentView.backgroundColor en su lugar.

Esto significa que tengo dos problemas:

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

Nota: Aquí hay una pregunta similar , pero eso estaba principalmente relacionado con silenciar el post, no encontrando una solución alternativa que resuelva ambos problemas anteriormente.

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

Esta es la mejor manera que he encontrado para resolver esto:

  1. Restablezca el color de background de su UITableViewHeaderFooterView a Pnetworkingeterminado .
  2. Agregue una única vista directamente debajo de la instancia de su UITableViewHeaderFooterView y UITableViewHeaderFooterView vista de contenido . (Esto es exactamente lo que hace Apple con una UITableViewCell , y solo estamos imitando esa estructura).
  3. Ahora puede cambiar el color de background de la vista de contenido para que sea lo que desee en el file xib.
  4. Coloque otras vistas inside la Content View .
  5. Redefina la propiedad contentView en un método de extensión y agrega IBOutlet a su definición. (Vea el código a continuación).
  6. Asocie la propiedad con la vista de contenido que creó, tal como lo haría con cualquier IBOutlet.
  7. Ahora puede cambiar el color de background utilizando contentView.backgroundColor en el código, tal como lo indica el post 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 documentation de Apple :

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

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

  1. Encabezado encontrado .xib en Xcode
  2. Haga clic derecho – Abrir como -> Código fuente
  3. Buscar key de color: Cmd-F – "backgr"
  4. Quítelo En mi caso fue la línea: <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  5. Ahora puedes cambiar background como:

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

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]]; } 

Configurar el color de background en UITableViewHeaderFooterView ha quedado en desuso. Utilice contentView.backgroundColor en su lugar.

Esto puede suceder si diseña su encabezado en un file xib separado y establece el background de la UIView principal allí.

Para resolver eso, revertir el color de background de UIView al color pnetworkingeterminado en InterfaceBuilder y establecer el color de background dentro del método de 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 ves, utilizamos header.contentView.backgroundColor y no header.backgroundColor (que es lo que realmente estaba haciendo el file xib).

Establezca contentView.backgroundColor en la callback de delegado willAppear:

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

o

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

¿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; }