2012-09-25 10 views
39

Vi esto usado en un video de WWDC pero solo muy brevemente. No entraron en cómo crear el archivo xib real.UITableView registerNib: forCellReuseIdentifier:

Tengo una subclase UITableViewCell llamada MyCustomCell. En esto tengo varias propiedades UILabels, UIImageViews, etc ... todas configuradas como IBOutlets.

Ahora, en mi archivo xib ...

Qué puedo configurar como propietario del archivo? ¿Dónde hago referencia a mi clase MyCustomCell si este es el propietario del archivo?

Una vez que he configurado el propietario del archivo, ¿cómo lo vinculo con la vista raíz del xib?

He intentado algunas configuraciones, pero sigo recibiendo errores al usarlo.

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

+0

Hola, @Fogmeister Tengo muchas dudas con respecto a cómo haces la pregunta. Las respuestas son correctas ya que han entendido correctamente. En el título de pregunta que mencionas sobre "register nib", y en el cuerpo que mencionas acerca de cómo vincular los archivos XIB con la clase Cell y out. –

+0

Lo siento, tengo prisa, pero mi pregunta es, ¿necesitamos registrar la celda, mientras estamos usando la celda personalizada, con xib. Y hago lo mismo que tu respuesta marcada. No estoy usando storyboard. –

+0

Estoy fuera, la mayoría veo mañana cuando voy a buscar trabajo. Gracias. Por favor. –

Respuesta

44

Normalmente usted no tiene que preocuparse por el propietario del archivo en ese caso, porque cuando el tableView crea una instancia de la celda del UINib proporcionado/asociado junto con el reuseIdentifier. Cargará todos los objetos de nivel superior de la punta, y utiliza solo el primer objeto de nivel superior que es de la clase UITableViewCell (o tal vez solo el primer objeto de nivel superior independientemente de la clase? Pero en general usted solo tenga su UITableViewCell en su XIB de todas formas, sin contar el File's Owner y el First Responder que son solo "proxies").

De hecho, el tableView intentará quitar la cola de una celda y, si no encuentra una reutilizable, creará una nueva utilizando el UINib que proporcionó. Será algo similares a esto:

NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0]; 
cell = [topLevelObjects objectAtIndex:0]; 

(Eso es, por supuesto, una versión simplificada sólo para mostrar la idea, no sé si en realidad llama a estas líneas exactas, pero debe ser muy estrecha)

Así la File's Owner no se utiliza en este caso particular, y sólo se necesita poner un simple encargo UITableViewCell como la única de nivel superior objeto de su archivo XI ter junto a la File's Owner ANF existente First Responder (que, de nuevo, son solo referencias "de proxies"/"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 así no funciona:

  • Asegúrese de que que llenó correctamente el reuseIdentifier de su UITableViewCell en IB (en el panel Inspector de objetos a la derecha una vez que haya seleccionado su celular en IB) y usaron exactamente el mismo valor para esta propiedad reuseIdentifier en IB que la 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.
+3

¡Gracias! Estaba dejando la vista superior como UIView y por eso no funcionaba. Una vez que eliminé eso y agregué un UItableViewCell como la vista superior funcionó bien. Gracias. – Fogmeister

+3

Solo quería comentar de nuevo. ¡Esto ha sido increíblemente útil! He rediseñado muchísima interfaz de usuario de mi guión gráfico y he separado archivos XIB, lo que ha reducido drásticamente la complejidad y el mantenimiento de la aplicación en la que estoy trabajando. Gracias de nuevo: D – Fogmeister

+0

Me alegro de que ayudó;) – AliSoftware

9

que he encontrado el código dado en la pregunta está bien, pero no se puede hacer referencia a self.tableView en el método init si está usando guiones gráficos. Hay algunos discussion al respecto en otra pregunta.

Así que la primera línea va en el init:

self.cellNib = [UINib nibWithNibName:@"MyCustomCell" bundle:nil];

Pero esta línea debe ir en viewDidLoad o similar:

[self.tableView registerNib:self.cellNib forCellReuseIdentifier:@"CustomCell"];

que fija mi misteriosa de error, 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 cosas de Storyboards y colocarlas en xibs para su reutilización a través de controladores de visualización.

+0

Ach, no es un mensaje de error muy obvio es! – fatuhoku

+0

@fatuhoku Bienvenido al mundo de los errores de xcode/objectivec. ¿No son esos puntos de interrupción estrepitosos en el método principal tan útiles? – csga5000

3

Además de Respuesta de "AliSoftware" Nota lo menos obvia aquí es que el UITableViewCell tiene que ser el Raíz Ver * * ARRIBA incluso el 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.