Soy capaz diseño personalizado UITableViewCells y los carga bien utilizando la técnica descrita en el hilo de encontrar en http://forums.macrumors.com/showthread.php?t=545061. Sin embargo, el uso de ese método ya no se permite la inicialización de la celda con un reuseIdentifier que significa que usted tiene que crear nuevas instancias de cada celda en cada llamada. Alguien ha descubierto una buena manera de seguir caché de tipos celulares específicos para reutiliza, pero aún así ser capaz de realizar el diseño en el Interface Builder?

InformationsquelleAutor Greg Martin | 2009-01-05

16 Comentarios

  1. 74

    Acaba de implementar un método con el método apropiado de la firma:

    - (NSString *) reuseIdentifier {
      return @"myIdentifier";
    }
    • Dónde se debe aplicar este método?
    • En su UITableViewCell subclase. developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/…
    • Esto es riesgoso. ¿Qué sucede si usted tiene dos subclases de su celda, subclase, y el uso de ambas en una única tabla a la vista? Si se envía la reutilización de identificador de llamada en super vas a quitar de la cola de una célula de tipo incorrecto………….. Creo que usted necesita para reemplazar el reuseIdentifier método, pero tiene que devolver un suplantado cadena de identificador.
    • Para estar seguro de que es único, usted puede hacer: return NSStringFromClass([self class]);
  2. 119

    Realidad, ya que son la construcción de la celda en el Interface Builder, acaba de establecer la reutilización identificador de allí:

    La carga de un Reutilizables UITableViewCell de una Punta

    O si está ejecutando Xcode 4, comprobar los Atributos del inspector de ficha:

    La carga de un Reutilizables UITableViewCell de una Punta

    (Edit: Después de que su XIB es generado por XCode, contiene un vacío UIView, pero necesitamos un UITableViewCell; así que tienes que quitar manualmente el UIView e insertar una Vista de Tabla de la Célula. Por supuesto, IB no muestran ningún UITableViewCell parámetros para una UIView.)

    • ¿Qué puedo configurar el Identificadores, si puedo usar esta Punta creado Células para más de una de las células? Esto nos llevará a tener dos células con el mismo identificadores.
    • No creo que esto es como un identificador único, piensen que es más como un nombre de tipo.
    • de modo que las células no puede ser único. Estoy en lo cierto?
    • Yo no estoy viendo la opción de establecer un identificador a través de la incorporada en el interface builder en Xcode 4.3.3. Definitivamente estoy de configuración de la clase a mi UITableViewCell subclase. Solo estoy perdiendo, o se ha ido?
    • Ok, he resuelto mi problema. Si usted comienza con una UIView objeto en el interface builder (dentro de Xcode 4), y el cambio de su clase para UITableViewCell, no se obtienen las células específicas de propiedades, como la reutilización de identificador. Para conseguir eso, se supone que debe empezar con un vacío xib y arrastre el cursor en una celda de la tabla objeto, que luego tienen las células específicas de propiedades que puede editar.
    • Piénsalo de esta manera-al crear la vista de la tabla de la célula con el identificador X, usted está diciendo «dame una celda de la piscina de la etiqueta X.» Si la piscina existe, y no es un celular gratis en, entonces eso le da a usted. De lo contrario, se crea la piscina (si es necesario), luego de noticias de la célula, las etiquetas «X», y luego se lo entrega a usted. Así, las células PUEDEN ser únicos-por ejemplo, usted podría crear un grupo con sólo una celda con un identificador en particular — pero la biblioteca se utiliza una lista libre-como estrategia para evitar que la memoria alloc/dealloc.
    • acabamos de este en XCode 5, y es ahí, así que estoy asumiendo que sí a la 4.3.3.

  3. 66

    Ahora, en iOS 5 hay un UITableView método para que:

    - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
    • Las otras respuestas en este hilo, incluyendo la aceptación de respuesta, contienen anticuado asesoramiento.
    • es esto compatible con versiones anteriores? Me refiero a que si puedo desarrollar una aplicación con un SDK 5.0 y el objetivo mínimo 4.0 de la aplicación se ejecutan en dispositivos con iOS 4.0, por ejemplo?
    • No, esto no es compatible con versiones anteriores, como cualquier nueva API de iOS 5.0.
    • ejemplo práctico de cómo integrar esto en su controlador: mindfiresolutions.com/…
  4. 47

    No recuerdo donde he encontrado este código originalmente, pero ha sido un gran trabajo para mí hasta ahora.

    - (UITableViewCell *)tableView:(UITableView *)tableView 
             cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static NSString *CellIdentifier = @"CustomTableCell";
        static NSString *CellNib = @"CustomTableCellView";
    
        UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
            cell = (UITableViewCell *)[nib objectAtIndex:0];
        }
    
        //perform additional custom work...
    
        return cell;
    }

    Ejemplo de diseño de Interfaz de instalación…

    La carga de un Reutilizables UITableViewCell de una Punta

  5. 12

    Vistazo a la respuesta que dio a esta pregunta:

    Es posible el diseño de NSCell subclases en el Interface Builder?

    No sólo es posible el diseño de un UITableViewCell en IB, es deseable porque de lo contrario todo el manual del cableado y la colocación de varios elementos es muy tedioso. Performaance está bien siempre y cuando usted tiene cuidado de hacer que todos los elementos opacos cuando sea posible. El reuseID se establece en IB para las propiedades de la UITableViewCell, a continuación, utilizar la coincidencia de la reutilización de IDENTIFICACIÓN en el código cuando se intenta eliminar de la cola.

    También he escuchado a algunos de los presentadores en la WWDC del año pasado que usted no debe tomar una vista de tabla de células en IB, pero es una carga de la litera.

    • Usted no debe tomar una vista de tabla de células en IB si necesita transparencia y quieren un buen rendimiento del desplazamiento. Por cierto de la UIs, se necesita transparencia (para representar el texto sobre los gráficos por ejemplo). A veces la única manera de lograr un buen desplazamiento en los más antiguos (pre-A4) hardware para representar en el código, para evitar que la GPU de haber compuesto de varias capas transparentes.
    • Cierto, pero a pesar de que usted puede ser mejor dejar que el rendimiento de sufrir ligeramente en los viejos dispositivos para facilitar el mantenimiento de las células, construido en el IB. Usted también puede usar esta técnica como una plantilla de células que, a continuación, extraer elementos de evitar composición con una costumbre de sacar método.
  6. 6

    Aquí hay otra opción:

    NSString * cellId = @"reuseCell";  
    //...
    NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];
    
    for (id obj in nibObjects)
    {
        if ([obj isKindOfClass:[CustomTableCell class]])
        {
            cell = obj;
            [cell setValue:cellId forKey:@"reuseIdentifier"];
            break;
        }
    }
    • Tenga en cuenta que esta es la única solución que ha publicado hasta el momento que no requiere de la creación de subclases personalizado UITableViewCell con el fin de establecer un valor único para reuseIdentifer. Creo que esto es lo que el op en realidad estaba buscando.
    • Espero que Apple no va a negar mi solicitud para el uso de este… yo estoy usando esto para la «estática» de las células, porque en mi mesa, de punto de vista, el proceso de relleno de una celda es tranquilo lento. De esta manera, sólo tengo que ejecutarlo una vez (dando un identificador diferente para cada fila). Gracias!
    • Muy útil ya que no hay UITableViewCell método para la configuración de este manual!
  7. 2

    Puedo crear mi vista personalizada de las células de una manera similar – excepto puedo conectar el celular a través de un IBOutlet.

    La [nib objectAt...] enfoque es susceptible a los cambios de las posiciones de los elementos en la matriz.

    La UIViewController enfoque está bien – probado, y funciona bastante bonito.

    PERO…

    En todos los casos el initWithStyle constructor NO es llamado, así que no hay defecto de inicialización se realiza.

    He leído varios lugares sobre el uso de initWithCoder o awakeFromNib, pero no hay pruebas concluyentes de que cualquiera de estos es el camino correcto.

    Aparte de una llamada explícita a algún método de inicialización en el cellForRowAtIndexPath método no he encontrado una respuesta a esto.

    • awakeFromNib es la manera correcta de reaccionar a un objeto que se carga desde una PUNTA.
  8. 2

    Hace un tiempo me encontré con una gran entrada en el blog sobre este tema en blog.atebits.com, y desde entonces han empezado a utilizar Loren Brichter ABTableViewCell clase para todos los de mi UITableViewCells.

    Usted termina con un simple contenedor de UIView poner todos sus widgets, y el desplazamiento es rápido como un rayo.

    Espero que esto sea útil.

  9. 2

    Esta técnica también funciona y no requiere de un funky ivar en su controlador de vista de la gestión de la memoria.
    Aquí, la costumbre de la vista de tabla de la célula vive en un xib denominado «CustomCell.xib».

     static NSData *sLoadedCustomCell = nil;
    
     cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
     if (cell == nil) 
     {
       if (sLoadedCustomCell == nil) 
       {        
          //Load the custom table cell xib
          //and extract a reference to the cell object returned
          //and cache it in a static to avoid reloading the nib again.
    
          for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
          {
            if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
            {
              sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
              break;
            }
        }
        cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
      }
    • Archivar y recuperar es totalmente innecesaria.
    • Comprimir/descomprimir es innecesario si usted está bien con la carga de la celda de su punta cada vez que no pueden ser descargados. Sin embargo, si sólo desea cargar el móvil de su punta exactamente al, entonces usted necesita para almacenar en caché en la memoria. Puedo lograr que el almacenamiento en caché utilizando NSKeyedArchiving porque UITableViewCell no implementar NSCopying.
    • Todo lo que dijo, usando UINib para cargar el celular logra el mismo efecto: la carga desde el disco de una vez, la carga de la memoria a partir de entonces.
  10. 2

    Louis método ha funcionado para mí. Este es el código que uso para crear el UITableViewCell de la punta:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {   
        UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];
    
        if (cell == nil) 
        {
            UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
            cell = (PostCell *)c.view;
            [c release];
        }
    
        return cell;
    }
  11. 2
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *simpleTableIdentifier = @"CustomCell";
    
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }         
    
    return cell;
    }
  12. 1

    La gustavogb solución no funciona para mí, lo que he intentado es :

    ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
    [[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
    cell = [c.blogTableViewCell retain];
    [c release];

    Parece que funciona.
    El blogTableViewCell es el IBOutlet para la célula y ChainesController es el propietario del archivo.

  13. 1

    De la UITableView docs con respecto a dequeueWithReuseIdentifier: «Una cadena que identifica el objeto de celda para ser reutilizados. De forma predeterminada, un reutilizables de la célula identificador es su nombre de la clase, pero se puede cambiar a cualquier valor arbitrario.»

    Primordial -reuseIdentifer sí mismo, es arriesgado. ¿Qué sucede si usted tiene dos subclases de su celda, subclase, y el uso de ambas en una única tabla a la vista? Si se envía la reutilización de identificador de llamada en super vas a quitar de la cola de una célula de tipo incorrecto………….. Creo que usted necesita para reemplazar el reuseIdentifier método, pero tiene que devolver un suplantado cadena de identificador. O, si uno no ha sido especificado, tienen que volver a la clase como una cadena.

  14. 0

    Para lo que vale, me pidió un iPhone ingeniero acerca de esto en uno de los iPhone Tech Talks. Su respuesta fue, «Sí, es posible el uso de IB para crear células. Pero no. Por favor, no».

    • Esto es muy extraño. Al menos dos de las conversaciones en la NY hablar tenido código de demostración que utiliza células creado en IB.
    • No estoy seguro creo que este ya que con el uso del IB para crear células en Apple Avanzada la Vista de la Tabla de las Células del proyecto de ejemplo.
    • Gracias por que. Cada vez que lo he hecho me he encontrado con problemas. Esta podría ser la razón
    • Él probablemente no tienen el suficiente conocimiento sobre la misma.
  15. 0

    He seguido de Apple instrucciones de como vinculados por Ben Mosher (¡gracias!) pero se encontró con que Apple se omite un punto importante. El objeto de diseño en IB es sólo un UITableViewCell, como es la variable de que la carga de la misma. Pero si realmente lo configure como una subclase personalizada de UITableViewCell, y escribir el código de los archivos de la subclase, se puede escribir IBOutlet declaraciones y IBAction métodos en el código y alambre hasta sus elementos personalizados en IB. Entonces no hay necesidad de utilizar etiquetas de visualización para acceder a estos elementos y usted puede crear cualquier tipo de loco de la celda a la que desea. Es el Cacao para Tocar el cielo.

Dejar respuesta

Please enter your comment!
Please enter your name here