2011-05-01 14 views
21

Tengo tres UITableViews diferentes, cada una en su propia vista, se accede a través de pestañas. Idealmente, las tres tablas compartirían la misma clase UITableViewCell personalizada y el archivo .xib.Un archivo xib con varios "Propietarios de archivo"

Empecé con una tabla, estableciendo la clase de .xib en mi clase personalizada y el propietario del archivo .xib en el UIViewController padre de la tabla, que funciona muy bien. Todo el código personalizado relacionado con la vista está en la clase de la celda (imágenes de fondo basadas en una propiedad establecida por el controlador, altura de celda personalizada basada en el número de líneas que una etiqueta requiere en función de una propiedad de celda establecida por el controlador, etc.) .

El resultado es agradable: la célula es responsable de todo el diseño visual y responde a las acciones del usuario en los controles de la celda, mientras que el controlador de vista es responsable de crear las celdas y establecer sus datos.

Ahora que necesito reutilizar la celda en otras tablas, sin embargo, el hecho de que la celda personalizada .xib tenga un único Propietario de archivo es un problema. En lugar de duplicar el archivo .xib, ¿existe una forma simple de permitir que varios controladores lo posean?

+0

Supongo que no estoy siguiendo su problema al 100%. ¿Está utilizando el método de delegado 'UITableView'' - (UITableViewCell *) cellForRowAtIndexPath: (NSIndexPath *) indexPath'? – joshpaul

+0

@joshpaul Sí. El problema es que los otros controladores de vista no tienen acceso a los controles/propiedades de .xib con otro controlador que actúa como propietario. –

+0

Tengo el xib 'Propietario del archivo' de mi célula personalizada en NSObject, y la 'Célula' en MyCustomTableViewCell. – joshpaul

Respuesta

37

El propietario del archivo de una ficha no se aplica estrictamente. En cambio, solo se usa para determinar salidas y acciones disponibles, y para establecer enlaces dentro de Interface Builder. Puede cargar una punta con cualquier objeto como propietario del archivo, independientemente de la clase establecida en el archivo de punta. Cuando se carga una punta, enviará mensajes al propietario del archivo para restablecer los enlaces. Si el objeto Propietario del archivo real no reconoce esos selectores, habrá activado una excepción de "selector no reconocido". Esto significa que si su plumilla une un poco UITableViewCell a la salida de "celda" del propietario del archivo, cualquier objeto con una propiedad de "celda" podría cargar ese plumín. Solo debe tener cuidado de no utilizar este comportamiento para enviar un selector no reconocido o una clase de salida inesperada.

En su caso, considere crear una única subclase UIViewController para actuar como el propietario del archivo de su plumilla. Haga que cada uno de sus tres controladores existentes extienda esa subclase del controlador de vista. De esta forma, todos pueden heredar el mismo conjunto de propiedades que espera el archivo nib y cargar de forma segura ese plumín mientras aún definen su propio comportamiento personalizado.

+0

Ah, gran idea. El problema central es que los otros controladores de vista no tenían acceso a las propiedades de la célula instanciada; esto lo resuelve muy bien. Gracias. –

+0

He estado trabajando en esto por un tiempo, y estoy delgado, estoy muy cerca de responder mi pregunta. Tal vez un poco de ayuda? Un esquema de cómo se usaría realmente tu sugerencia sería genial. He intentado, y no puedo obtener tres subclases diferentes de UITableViewCell para compartir el mismo TVCell en un XIB. – mputnamtennessee

+3

@mputnamtennessee que no podrás hacer. La clase de la vista cargada desde un archivo de punta está definida por el plumín mismo. La respuesta anterior se refería a diferentes clases de controlador cargando instancias de la misma UITableViewCell desde un archivo nib común. Eso es diferente a intentar cargar múltiples subclases de la clase encontrada en un plumín fuera del plumín mismo. Parece que tienes un problema diferente para resolver, para el cual probablemente valga la pena abrir una nueva pregunta. – Jonah

4

El checked answer a this question discute dos enfoques para cargar celdas de la tabla personalizada a partir de cacao archivos que no requieren para establecer propietario del archivo a su controlador específico. Estos enfoques le permiten reutilizar celdas con diferentes propietarios.

+1

Gracias por señalarme esos, ambas son buenas maneras de estructurar las cosas para que funcionen de la manera que me gustaría. Lamentablemente, ambos requerirían una reestructuración significativa de otro código, que no tengo tiempo por ahora. Sin embargo, estoy seguro de que pagaré por esa opción más tarde, una especie de código de karma. :) –

1

Una superclase "compartida" como propietario de un archivo no siempre es una buena solución. Recuerde que siempre puede cargar el xib en su opinión, y hacer conexiones sin usar salida, por ejemplo:

UIView *aView = [[NSBundle mainBundle] loadNibNamed:@"MyXibFile" owner:self options:nil] 
//Search subviews by tag. Obviously you need to set the tag on your view in MyXibFile 
UILabel *aLabel = (UILabel*)[aView viewWithTag:996]; 
UILabel *aTextField = (UITextField*)[aView viewWithTag:997]; 
aTextField.delegate = self; 
//etc... 

No puedo decir que esta es una solución limpia, pero en algunos casos podría funcionar mejor que herencia .

Cuestiones relacionadas