Puedo diseñar UITableViewCells personalizadas y cargarlas sin problemas utilizando la técnica descrita en el hilo que se encuentra en http://forums.macrumors.com/showthread.php?t=545061 . Sin embargo, usar ese método ya no le permite iniciar la celda con un reuseIdentifier, lo que significa que debe crear instancias completamente nuevas de cada celda en cada llamada. ¿Alguien ha descubierto una buena manera de almacenar en caché determinados tipos de celdas para su reutilización, pero aún así poder diseñarlos en Interface Builder?
ios
iphone
uitableview
cocoa-touch
interface-builder
Greg Martin
fuente
fuente
return NSStringFromClass([self class]);
En realidad, dado que está construyendo la celda en Interface Builder, simplemente establezca el identificador de reutilización allí:
O si está ejecutando Xcode 4, consulte la pestaña del inspector de atributos:
(Editar: Después de que XCode genera su XIB, contiene una UIView vacía, pero necesitamos una UITableViewCell; por lo que debe eliminar manualmente la UIView e insertar una celda de vista de tabla. Por supuesto, IB no mostrará ningún parámetro de UITableViewCell para una UIView.)
fuente
Ahora, en iOS 5 hay un método UITableView apropiado para eso:
fuente
No recuerdo dónde encontré este código originalmente, pero me ha funcionado muy bien hasta ahora.
Ejemplo de configuración de Interface Builder ...
fuente
Mira la respuesta que di a esta pregunta:
¿Es posible diseñar subclases de NSCell en Interface Builder?
No solo es posible diseñar un UITableViewCell en IB, es deseable porque, de lo contrario, todo el cableado manual y la colocación de múltiples elementos es muy tedioso. El rendimiento está bien siempre que tenga cuidado de hacer que todos los elementos sean opacos cuando sea posible. El reuseID se establece en IB para las propiedades de UITableViewCell, luego usa el ID de reutilización coincidente en el código cuando intenta quitar la cola.
También escuché de algunos de los presentadores en la WWDC el año pasado que no debería hacer celdas de vista de tabla en IB, pero es un montón de tonterías.
fuente
A partir de iOS alrededor de 4.0, hay instrucciones específicas en los documentos de iOS que hacen que esto funcione súper rápido:
http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7
Desplácese hacia abajo hasta donde habla sobre la subclasificación de UITableViewCell.
fuente
Aquí hay otra opción:
fuente
UITableViewCell
para establecer un valor único parareuseIdentifer
. Creo que esto es lo que estaba buscando la operación original.Creo mis celdas de vista personalizadas de manera similar, excepto que conecto la celda a través de un IBOutlet.
los
[nib objectAt...]
enfoque es susceptible de cambios en las posiciones de los elementos de la matriz.los
UIViewController
enfoque es bueno, solo lo probé y funciona lo suficientemente bien.PERO...
En todos los casos
initWithStyle
NO se llama constructor, por lo que no se realiza una inicialización predeterminada.He leído varios lugares sobre el uso
initWithCoder
oawakeFromNib
, pero no hay evidencia concluyente de que cualquiera de estos sea la forma correcta.Aparte de llamar explícitamente a algún método de inicialización en el
cellForRowAtIndexPath
método, todavía no he encontrado una respuesta a esto.fuente
Hace un tiempo encontré una excelente publicación de blog sobre este tema en blog.atebits.com , y desde entonces comencé a usar la clase de Loren Brichter ABTableViewCell para hacer todas mis UITableViewCells.
Terminas con un contenedor UIView simple para colocar todos tus widgets, y el desplazamiento es muy rápido.
Espero que esto sea de utilidad.
fuente
Esta técnica también funciona y no requiere un ivar funky en su controlador de vista para administrar la memoria. Aquí, la celda de vista de tabla personalizada vive en un xib llamado "CustomCell.xib".
fuente
El método Louis funcionó para mí. Este es el código que utilizo para crear UITableViewCell desde la punta:
fuente
fuente
La solución gustavogb no funciona para mí, lo que probé es:
Parece funcionar. BlogTableViewCell es el IBOutlet de la celda y ChainesController es el propietario del archivo.
fuente
De los documentos de UITableView sobre
dequeueWithReuseIdentifier
: "Una cadena que identifica el objeto de celda que se reutilizará. Por defecto, el identificador de una celda reutilizable es su nombre de clase, pero puede cambiarlo a cualquier valor arbitrario".Anular -reuseIdentifer usted mismo es riesgoso. ¿Qué sucede si tiene dos subclases de su subclase de celda y usa ambas en una vista de tabla única? Si envían la llamada del identificador de reutilización a super, quitará de la cola una celda del tipo incorrecto ... Creo que debe anular el método reuseIdentifier, pero que devuelva un identificador suplantado cuerda. O, si no se ha especificado uno, haga que devuelva la clase como una cadena.
fuente
Por lo que vale, le pregunté a un ingeniero de iPhone sobre esto en una de las charlas técnicas de iPhone. Su respuesta fue: "Sí, es posible usar IB para crear células. Pero no lo hagas. Por favor, no lo hagas".
fuente
Seguí las instrucciones de Apple enlazadas por 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 ella. Pero si realmente lo configura como una subclase personalizada de UITableViewCell y escribe los archivos de código para la subclase, puede escribir declaraciones IBOutlet y métodos IBAction en el código y conectarlos a sus elementos personalizados en IB. Entonces no es necesario usar etiquetas de vista para acceder a estos elementos y puede crear cualquier tipo de celda loca que desee. Es el paraíso de Cocoa Touch.
fuente