uitableviewcell switch stepper iphone cocoa-touch uitableview interface-builder

iphone - switch - Cargar una UITableViewCell reutilizable desde un plumín



uitableviewcell in swift (16)

A partir de iOS circa 4.0, hay instrucciones específicas en los documentos de iOS que hacen que esto funcione muy rápido:

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

Desplácese hasta donde se habla de la subclasificación de UITableViewCell.

Puedo diseñar UITableViewCells personalizadas y cargarlas bien utilizando la técnica descrita en el hilo que se encuentra en http://forums.macrumors.com/showthread.php?t=545061 . Sin embargo, el uso de ese método ya no le permite iniciar la celda con un reuseIdentifier, lo que significa que debe crear instancias completas de cada celda en cada llamada. ¿Alguien ha descubierto una buena manera de almacenar en caché tipos de células particulares para reutilizaciones, pero aún así poder diseñarlas en Interface Builder?


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

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier


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


Creo mis celdas de vista personalizada de una manera similar, excepto que conecto la celda a través de un IBOutlet.

El enfoque [nib objectAt...] es susceptible a cambios en las posiciones de los elementos en el conjunto.

El enfoque de UIViewController es bueno, solo lo probé y funciona bastante bien.

PERO...

En todos los casos, el constructor initWithStyle NO se llama, por lo que no se realiza ninguna inicialización predeterminada.

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

Además de llamar explícitamente a un método de inicialización en el método cellForRowAtIndexPath , todavía no he encontrado una respuesta.


De los documentos de UITableView relacionados con dequeueWithReuseIdentifier : "Una cadena que identifica el objeto de celda que se reutilizará. De forma predeterminada, un identificador de celda reutilizable es su nombre de clase, pero puede cambiarlo a cualquier valor arbitrario".

Anular-reuseIdentifer usted mismo es arriesgado. ¿Qué sucede si tiene dos subclases de su subclase de celda y las usa en una sola vista de tabla? Si envían la llamada de identificador de reutilización a super, se descolará una celda del tipo equivocado .............. Creo que debes anular el método reuseIdentifier, pero que devuelva un identificador suplantado cuerda. O bien, si no se ha especificado uno, haz que devuelva la clase como una cadena.


El método de Louis funcionó para mí. Este es el código que uso para crear UITableViewCell desde el plumín:

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


En realidad, dado que está construyendo la celda en Interface Builder, simplemente configure el identificador de reutilización allí:

O si está ejecutando Xcode 4, verifique la pestaña del inspector de Atributos:

(Editar: una vez que su XIB es generado por XCode, contiene un UIView vacío, pero necesitamos una UITableViewCell, por lo que debe eliminar manualmente UIView e insertar una celda de vista de tabla. Por supuesto, IB no mostrará ningún parámetro UITableViewCell para una UIView.)


Esta técnica también funciona y no requiere un ivar funky en su controlador de vista para la gestión de la memoria. Aquí, la celda de vista de tabla personalizada vive en un xib llamado "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]; }


Hace un tiempo encontré una excelente publicación de blog sobre este tema en blog.atebits.com , y desde entonces comencé a utilizar la clase ABTableViewCell de Loren Brichter para hacer todas mis UITableViewCells.

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

Espero que esto sea útil.


La solución de gustavogb no funciona para mí, lo que probé es:

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

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


Mira la respuesta que di a esta pregunta:

¿Es posible diseñar subclases NSCell en Interface Builder?

No solo es posible diseñar una UITableViewCell en IB, sino que es deseable porque de lo contrario todo el cableado manual y la colocación de múltiples elementos es muy tedioso. La performancia está bien siempre que tenga cuidado de hacer todos los elementos opacos cuando sea posible. El reuseID se configura en IB para las propiedades de UITableViewCell, luego usa la identificación de reutilización correspondiente en el código cuando intenta dequeuear.

También escuché de algunos de los presentadores en WWDC el año pasado que no deberían hacer celdas de vista de tabla en IB, pero es una carga de litera.


No recuerdo dónde encontré este código originalmente, pero hasta ahora ha funcionado muy bien.

- (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 configuración del generador de interfaz ...

texto alternativo http://i32.tinypic.com/a9mnap.jpg


Por lo que vale, le pregunté a un ingeniero de iPhone sobre esto en una de las Tech Tech Talks de iPhone. Su respuesta fue: "Sí, es posible usar IB para crear celdas. Pero no lo hagas. Por favor, no lo hagas".


Seguí las instrucciones de Apple tal como las relacionó Ben Mosher (¡gracias!) Pero descubrí que Apple omitió un punto importante. El objeto que diseñan en IB es solo una UITableViewCell, al igual que la variable que cargan desde él. Pero si realmente lo configura como una subclase personalizada de UITableViewCell y escribe los archivos de código para la subclase, puede escribir las declaraciones IBOutlet y los métodos IBAction en el código y conectarlos a sus elementos personalizados en IB. Entonces no hay necesidad de usar etiquetas de vista para acceder a estos elementos y puedes crear cualquier tipo de celda loca que desees. Es el cielo de Cocoa Touch.


Simplemente implemente un método con la firma de método apropiada:

- (NSString *) reuseIdentifier { return @"myIdentifier"; }


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