Después de muchos años de evitar Generador de Interfaz como de la peste que me decidí a darle una oportunidad. No es fácil.

Tomar UITableViewHeaderFooterView por ejemplo. Como UITableViewCell, tiene un contentView de la propiedad. A diferencia de UITableViewCell, no tiene una plantilla en la Interfaz de la biblioteca de objetos.

Cómo se supone que vamos a utilizar el Interface Builder para crear un UITableViewHeaderFooterView con el contenido en el interior contentView? El hecho de que registerNib:forHeaderFooterViewReuseIdentifier: existe me hace pensar que esto debería ser posible de alguna manera.

InformationsquelleAutor hpique | 2013-10-03

8 Comentarios

  1. 30

    Este es el más cercano que tengo a definir un UITableViewHeaderFooterView con IB:

    una. Crear un UITableViewHeaderFooterView subclase (MYTableViewHeaderFooterView).

    b. Crear un archivo nib para la contentView sólo (MYTableViewHeaderFooterContentView).

    c. Reemplazar initWithReuseIdentifier: en MYTableViewHeaderFooterView para cargar la vista definida en el archivo nib.

     - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithReuseIdentifier:reuseIdentifier];
        if (self)
        {
            NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"MYTableViewHeaderFooterView"
                                                              owner:self
                                                            options:nil];
            UIView *nibView = [objects firstObject];
            UIView *contentView = self.contentView;
            CGSize contentViewSize = contentView.frame.size;
            nibView.frame = CGRectMake(0, 0, contentViewSize.width, contentViewSize.height);
            [contentView addSubview:nibView];
        }
        return self;
    }

    d. Registrar el MYTableViewHeaderFooterView clase en lugar de la punta de archivo:

    [self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"];
    • Que ha trabajado en iOS 6 y iOS 8.
    • contentViewSize es {0,0,0,0}
    • Esto es realmente innecesaria y apple tiene algún código de ejemplo para demostrar esto. La vinculación de esta pregunta para los recién llegados stackoverflow.com/a/20073742/1652402
    • una explosión del pasado – puede utilizar contentView.límites en lugar de CGRectMake, aunque @DanielGalasko respuesta es irregular en
  2. 25

    Yo solo hice esto con un pie de página y una PUNTA de archivo:

    1. Crear un vacío de archivo NIB con el nombre CustomFooterView.xib.
    2. Editar el archivo NIB en el Interface Builder y cambiar la parte más alta de UIView clase personalizada para UITableViewHeaderFooterView.
    3. Deshabilitar Diseño Automático en la PUNTA.
    4. Establecer el color de fondo de UITableViewHeaderFooterView ver a Defecto.
    5. Hacen la vista de forma libre y de tamaño correcto (por ejemplo 320 x 44).
    6. En su UITableViewController viewDidLoad registrar el archivo NIB para ser utilizado con una reutilización identificador:

      [self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"];
    7. En su UITableViewController del tableView:viewForFooterInSection: utiliza el Pie de página identificador para recuperar y devolver la vista:

      - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
      {
          if (section == 2)
              return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
      
          return nil; 
      }
    • Funciona muy bien, aunque tuve que hacer dos cosas más para conseguir que esto funcione: 1. Deshabilitar el Diseño de la PUNTA. 2. Establecer el color de fondo de la UITableViewHeaderFooterView la vista en la PUNTA para «Default».
    • Gracias @Frederik, he actualizado la respuesta basada en eso.
    • Creo que esta es la mejor solución ya que puede conectar los puntos de venta en este xib, en la solución que usted no puede
    • Esta es una solución más limpia a mí.
    • Esta solución funcionó muy bien y mucho más limpio en comparación con el uso de formato tableview celda de encabezado.
  3. 13

    Sólo el uso de la UITableViewCell de la plantilla en IB. Cambiar la clase a UITableViewHeaderFooterView. Aquí lo tienen… con un contentView.

    • Esta es la mejor solución!
  4. 7

    He encontrado una manera más fácil.

    1) Crear una subclase de UITableViewCell y establecer su archivo xib

    2) En el archivo de encabezado cambio superclase de UITableViewCell a UITableViewHeaderFooterView

    Que es.

    • Esto no parece funcionar con XCode 6.4, al menos. Cuando intenta cambiar la clase en IB, que no la completa (una buena señal de que las cosas van mal). Si usted clic de distancia y volver, vuelve a la UITableViewCell. Si nos fijamos en la Punta de la lista de objetos, un UITableViewCell se muestra. Cuando se trate de carga, una afirmación de incendios cuando el encabezado es eliminando acerca de ser el tipo equivocado: 'invalid nib registered for identifier (sectionHeader) - nib must contain exactly one top level object which must be a UITableViewHeaderFooterView instance'
  5. 6

    Esta solución funciona bien, sobre todo si quieres que funcione correctamente en relación con el Contenido de lectura de las Guías (introducido en iOS 9). En lugar de crear un UITableViewHeaderFooterView, simplemente se vuelve una costumbre UIView (a partir de un XIB) cuando es necesario:

    1. Crear una nueva clase que las subclases de UIView («AwesomeHeaderView») y crear sus puntos de venta:

      class AwesomeHeaderView: UIView {
          @IBOutlet var myCustomLabel: UILabel!
      }
    2. Crear un archivo XIB («MyNewHeader.xib») con un UIView como
      la vista principal. El cambio de la matriz UIView del tipo de clase a su recién creado de la clase personalizada («AwesomeHeaderView»). Como necesario, agregar más puntos de vista como es que los niños y enlace salidas, etc. (NB: Para garantizar vistas a cumplir el nuevo Contenido de lectura de las Guías que me marque las casillas de «Preservar Superview Márgenes» y «Siga Legible Ancho» en todos los objetos).
    3. En su UIViewController (o
      UITableViewController) llamar a los siguientes:

      func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
          guard let headerView = NSBundle.mainBundle().loadNibNamed("MyNewHeader", owner: nil, options: nil).first as? AwesomeHeaderView else {
              return nil
          }
      
          //configure header as normal
          headerView.backgroundColor = UIColor.redColor()
          headerView.myCustomLabel.textColor = UIColor.whiteColor()
          headerView.myCustomLabel.text = "Hello"
      
          return header
      }
  6. 1

    También experimenté el mismo mensaje de advertencia y una incapacidad para establecer el color de fondo, etc.. Finalmente, he encontrado que de acuerdo a la documentación de Apple,

    Puede utilizar [la UITableViewHeaderFooter] clase-es sin subclases en la mayoría de los casos. Si tiene contenido personalizado para mostrar, crear las subvistas por su contenido y agregarlos a la vista en el contentView de la propiedad.

    Siguiente sugerencia, me tomé estos pasos:

    1. He creado un xib con una vista que se extiende sólo UIView–no UITableViewHeaderFooter.
    2. En viewDidLoad me he registrado la incorporada en el UITableViewHeaderFooter clase

      formato tableview.registerClass(UITableViewHeaderFooterView.yo, forHeaderFooterViewReuseIdentifier: «sectionHeader»)

    3. En el viewForHeaderInSection delegado de mi UITableViewController, me eliminando el encabezado de la vista por ese identificador y comprueba para ver si el encabezado de la vista ya contenía una subvista. Si no, puedo cargar mi xib y agregarlo. Entonces me puse mi texto como sea necesario.

      override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
      let header = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier("sectionHeader")!
      
      if header.contentView.subviews.count == 0 { header.contentView.addSubview(loadMyNib()) }
      
      let myView = header.contentView.subviews[0] as! MyView
      myView.label.text = "..."

    Esto parece funcionar, aprovecha la reutilización, y no produce ningún tipo de advertencias.

    https://developer.apple.com/library/prerelease/tvos/documentation/UIKit/Reference/UITableViewHeaderFooterView_class/index.html#//apple_ref/occ/instm/UITableViewHeaderFooterView/prepareForReuse

  7. 1

    Siguientes soluciones me permiten arrastrar asignar IB artículos del código como variables. UITableViewHeaderFooterView no permitir que fuera de la caja.

    1. crear un (Nuevo Archivo/CocoaTouchClass) UITableViewHeaderFooterView
      .h.m.xib normalmente

    2. temporalmente cambiar el nombre de la superclase de UITableViewHeaderFooterView a UIView. Arrastrar asignar sus elementos de interfaz de usuario para el código según sea necesario, IB asignar clave-valor
      correctamente, volver a UITableViewHeaderFooterView cuando haya terminado.

    3. en su formato tableview, uso registerNib: para registrarse en lugar de registerClass:. preparar el resto de formato tableview normalmente (es decir:de la cola).
  8. 0

    Una terrible hack que me di cuenta es crear un IBOutlet contentView ih tu headerFooter clase y conectarlo a la de su «contenido» en el xib (Tiene su xib diseñado como un tableViewCell, Ver->contentView->mystuff).

    Obtendrá advertencias, ok listo para el hack…

    Eliminar la IBOutlet, y todo el trabajo.

Dejar respuesta

Please enter your comment!
Please enter your name here