iphone - UITableView registerNib: forCellReuseIdentifier:
register cell swift (3)
Además de Answer from "AliSoftware" Note que lo menos obvio aquí es que UITableViewCell tiene que ser la Vista raíz * ARRIBA * incluso la UIView. De forma predeterminada, cuando seleccioné un nuevo archivo IB, creo un UIView. Así que eliminar UIView ayuda. Gracias.
PD: Quería comentar esa respuesta, pero por alguna extraña razón no puedo hacer ningún comentario, solo puedo responder. Supongo que necesito una cierta calificación.
Vi esto usado en un video de WWDC pero solo muy brevemente. No entraron en cómo crear el archivo xib real.
Tengo una subclase UITableViewCell llamada MyCustomCell. En esto tengo varias propiedades UILabels, UIImageViews, etc ... todas configuradas como IBOutlets.
Ahora, en mi archivo xib ...
¿Qué configuro como el propietario del archivo? ¿Dónde hago referencia a mi clase MyCustomCell si este es el propietario del archivo?
Una vez que establezco el propietario del archivo, ¿cómo lo vinculo con la vista raíz del xib?
Intenté algunas configuraciones pero sigo recibiendo errores cuando lo uso.
Oh, el código que estoy usando para registrarlo es ...
self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];
[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];
Gracias
He encontrado que el código proporcionado en la pregunta está bien, pero no puedes referirte a self.tableView
en el método init
si estás usando storyboards. Hay una discussion sobre esto en otra pregunta.
Entonces la primera línea va en el init
:
self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];
Pero esta línea debería ir en viewDidLoad
o similar:
[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];
Eso soluciona mi error misterioso, por ejemplo, "*** Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''Could not load NIB in bundle: ''NSBundle <Foo.app> (loaded)'' with name ''Ogf-Sj-1ej-view-bBf-Ti-Dda''''"
Y, sí, estoy haciendo algo muy similar para sacar las cosas de Storyboards y colocarlas en xibs para su reutilización en los controladores de visualización.
Normalmente no tiene que preocuparse por el propietario del archivo en ese caso, porque cuando tableView
instancia de la celda del UINib
proporcionado / asociado junto con reuseIdentifier
. Cargará todos los objetos de nivel superior de la punta, y usará solo el primer objeto de nivel superior que sea de la clase UITableViewCell
(o tal vez solo el primer objeto de nivel superior, independientemente de la clase, pero en general solo tiene su UITableViewCell
en su XIB de todos modos, sin contar el File''s Owner
y el First Responder
que son solo "servidores proxy".
De hecho, tableView
intentará quitar la cola de una celda y, si no encuentra una reutilizable, creará una nueva usando el UINib
que proporcionó. Será algo similar a esto:
NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0];
cell = [topLevelObjects objectAtIndex:0];
(Esa es, por supuesto, una versión simplificada solo para mostrar la idea, no sé si realmente llama a estas líneas exactas, pero debería ser bastante estrecha)
Por lo tanto, el File''s Owner
no se utiliza en este caso particular, y usted solo necesita poner una UITableViewCell
personalizada simple como el único objeto de nivel superior de su archivo XIB junto al File''s Owner
existente y File''s Owner
First Responder
(que, nuevamente, son solo "proxies" / "referencias de objetos externos" y no se crearán instancias y no formarán parte de los objetos de nivel superior devueltos por instantiateWithOwner:options:
.
Si aún no funciona:
- Asegúrese de haber rellenado correctamente el
reuseIdentifier
de suUITableViewCell
en IB (en el panel Inspector de objetos a la derecha una vez que seleccionó su celda en IB), y use exactamente el mismo valor para esta propiedadreuseIdentifier
en IB que el que usa en su código . - Si todavía no tiene suerte, proporcione más información, especialmente qué tipo de error, mensaje de registro o excepción tiene.