2012-01-24 10 views
12

De acuerdo. He hecho más UITableViewCells personalizadas de las que puedo contar en los últimos tres años.iOS 5 UITableViewCell personalizado XIB's aka "¿Estoy perdiendo la cabeza?"

Luego viene iOS 5 y acabo de recibir un proyecto en mi escritorio donde tengo que hacer un poco más.

Así que la forma en que solía hacer esto es hacer un XIB personalizado, arrastrar una UITableViewCell en el lienzo, conectar mis controles, configurar la clase personalizada, hacer mi enlace ... luego cargar la instancia de la celda en el código haciendo un bucle a través de los objetos después de desempacar el XIB.

¿Tantas veces tuve una sola función de categoría para manejar todo el asunto.

Ahora, de repente en iOS 5 está sirviendo grandes celdas blancas en blanco cada vez que hago una celda personalizada.

Aquí están las siguientes características de las células personalizados que se inserta en la tabla

1) Mostrar completamente blanco puro, aparte de los controles UITableViewCell "por defecto" (textLabel, etc, se rellenará y mostrar cuando me puse de texto para ellos).

2) isKindOfClass (MyCustomCellClass) informa verdadera

3) métodos setter en la clase de celda personalizado están funcionando, punteros de objeto para valores de ajuste y UILabels personalizados y todos los informes tales como la no nula, es decir, la célula es en realidad conseguir hecho e instanciado correctamente del XIB

4) Mostrará controles poco convencionales como un UIStepper incondicionalmente por algún motivo. Así que sí, si coloco un stepper en mi celda personalizada, se muestra, pero las etiquetas y las imágenes no.

Lo mejor que puedo imaginar es que algo oscurece la vista de contenido de forma predeterminada o, de lo contrario, los controles personalizados que estoy creando ya no se asignan al contentView de la celda (como solían ser) y en su lugar simplemente siendo arrojado al espacio exterior.

Por ejemplo, en el IOS 4 de XI ter, que utilizan para ver este momento de elaborar una célula de medida (extraídos de la documentación de Apple iOS 5):

Pulled from Apple's iOS 5 documentation

Pero a partir de este momento, esto es lo que yo ver cuando se hace lo mismo en un iOS 5 XI ter

enter image description here

por lo tanto, tenga en cuenta que no está mostrando explícitamente que poco ver contenido línea de puntos más.

Realmente he agotado todos mis conocimientos de diagnóstico sobre este problema. Intenté cargar manualmente todas las etiquetas personalizadas directamente en la vista de contenido en tiempo de ejecución, pero incluso eso no funciona.

Estoy buscando ideas.

editar Código

de carga XI ter

if (cell == nil) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"XCCodeViewCell" owner:self options:nil]; 
    cell = codeCell; 
    self.codeCell = nil; 
} 

Ésta es actualmente lo es después de simplificarlo basado en nuevos IOS de Apple 5 recomendaciones.El XIB tiene su propietario configurado correctamente en la clase de "self", y codeCell está vinculado a la celda correctamente, con la clase y el identificador correctos.

+0

¿Puede publicar el código donde está desempacando el xib de la celda para usar en una vista de tabla? –

+0

No es seguro, pero echa un vistazo a la respuesta aquí: [http://stackoverflow.com/questions/7640159/iphone-uitableview-with-custom-cell-xcode-4/7640401#7640401][1] [1]: http://stackoverflow.com/questions/7640159/iphone-uitableview-with-custom-cell-xcode-4/7640401#7640401 –

+0

Owen esto no es un error de enlace. El enlace es perfecto. La celda es exactamente lo que dice que es y los controles están siendo manipulados. Simplemente no son * visibles *. –

Respuesta

24

Wow, Éste me tomó un tiempo para probar, pero creo que tengo la respuesta para usted ...

Con Xcode4 en constructor de interfaces añadieron la posibilidad de configurar de forma estática en tableViewCells constructor de interfaces. Esto es genial cuando quieres diseñar tableViews que no cambien y no quieras escribirlos en código. Para facilitar esto, han establecido la capacidad de establecer el estilo tableViewCell en IB y ver cómo se ve. Cuando diseñas tu propia celda con tus propias subvistas, seleccionas "Personalizar".

Con los desarrollos iOS 5 encontré lo siguiente; Cuando cargué una celda de por xib y luego establecí programáticamente textLabel.text u otro atributo de uno de los estilos de celda estándar, parece que tableViewCell genera esa vista estándar con las etiquetas predeterminadas y superpone su vista personalizada con ella. Por lo tanto, para mantener sus subvistas de celda personalizadas no necesita acceder a ninguna de las propiedades estándar de tableCell.

Cool.

También es nuevo en iOS 4 el UINib. Debería usar UINib para cargar tableViewCells desde xibs ya que tiene caché y es toneladas más rápido (todo lo mejor para su desplazamiento tableView). El arco del código es el siguiente:

cabecera:

@property (nonatomic, strong) UINib * tableCellLoader; 

archivo .m:

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    self.tableCellLoader = [UINib nibWithNibName:@"MyTableViewCell" bundle:nil]; 
} 

Luego, en tableView: cellForRowAtIndexPath:

... 
if (cell == nil) { 
    cell = [[self.tableCellLoader instantiateWithOwner:self options:nil] objectAtIndex:0]; 
} 
... 

EDIT: actualización de nuevo en iOS 5 Nuevo en iOS 5 es la capacidad para que UITableView guarde xibs para cer retenga los identificadores de reutilización de celda y luego instale una nueva celda de ese tipo si no hay ninguno en la cola de reutilización.

Salida

– registerNib:forCellReuseIdentifier: 

Luego, cuando se hacen

– dequeueReusableCellWithIdentifier: 

Tiene la garantía de obtener una UITableViewCell del tipo especificado espalda. Te ahorra hacer todo tú UINib.

+1

Esto es consistente con lo que he estado viendo. Creo que lo has clavado. –

+2

+1 para UINib - curiosamente, nunca más usamos plumillas, solo xibs, ¿por qué el nombre retro de apple? – slf

+0

xib's se compilan en plumillas incluso hoy en día; meter la cabeza dentro de uno de sus propios archivos .ipa en algún momento. – jer

Cuestiones relacionadas