2012-06-04 7 views
8

tengo una pregunta similar a Cocoa - View-Based NSTableView, using one cell in multiple tables, amplificado por Apple's own docs para makeViewWithIdentifier:owner:NSTableView makeViewWithIdentifier través de nibs

"Típicamente identificador está asociado con un SEMILLA externa en Interface Builder y la vista de tabla se instanciar automáticamente la SEMILLA con el propietario proporcionado ".

Esto parece implicar que usted debería ser capaz de almacenar la NSTableCellView en una punta separada de la semilla que contiene el NSTableView. Sin embargo, en mis experimentos, solo he podido obtener celdas que están contenidas dentro de la vista de tabla a la que llamo. Es decir, si corté y pegué mi celda en un nuevo archivo .xib, la vista de tabla ya no puede encontrarlo. ¿Qué estoy haciendo mal, o esto es realmente imposible y de alguna manera estoy malinterpretando los documentos de Apple?

Respuesta

3

Acabo de toparme con este problema y creo que no puedes usar makeViewWithIdentifier: owner: cuando estás usando un Nib dedicado para rellenar tablas basadas en la vista.

El problema tiene que ver con los propietarios de archivos (es decir, controladores de vista). makeViewWithIdentifier: owner: parece destinado a ser utilizado con "self" como propietario de vistas personalizadas simples.

Generalmente, si tiene una punta separada para la vista personalizada con tomas de corriente, también va a necesitar un controlador de vista separado. De lo contrario, si su vista personalizada tiene una salida y la tabla muestra muchas vistas personalizadas, ¿a qué salida se refiere desde el propietario de la vista de tabla "propia"?

Así que en mi prueba, tengo el AppDelegate como el delegado/fuente de datos de la Vista de tabla. Tengo un CellView.xib y CellViewController.h/.m con salidas a la interfaz. Luego, en mi tableView: viewForTableColumn: Fila: método delegado tengo este código:

SSCellViewController *vc = [[SSCellViewController alloc] initWithNibName:@"CellView" bundle:nil]; 
return vc.view; 

Lo que se pierde es la célula de reutilización que ocurre de forma automática con makeViewWithIdentifier: propietario :. Para implementarlo usted mismo, también es probable que tenga que lidiar con la administración de muchos controles de vista que ha creado.

Todavía me podría estar faltando algo, ya que estoy llegando al desarrollo de OS X después de años de solo hacer el trabajo de iOS.

+2

Crea una instancia de un controlador de vista pero solo devuelve su vista. ¿A quién pertenece el controlador de vista? ¿No se desasigna automáticamente de ARC? ¿No tiene fugas de lo contrario? –

5

Utilice - (void)registerNib:(NSNib *)nib forIdentifier:(NSString *)identifier para registrar una semilla que se utilizará con un identificador de celda.

Si no funciona, probablemente esté registrando el plumín después de que se hayan cargado los datos de tableView. Use los términos posteriores [tableView reloadData] para asegurarse de que no sea un problema de tiempo.

+1

Hm ... parece un nuevo método en 10.8. ¿Los desarrolladores que apuntan a 10.7 no tienen suerte? –

+1

En 10.7 debería poder construir NSTableCellView como objetos de nivel superior en la misma punta que su NSTableView. Ten cuidado, sin embargo. A través de mi prueba, parece que el plumín se crea cada vez que se crea una celda. En otras palabras, si tiene bastantes otros objetos en su plumilla, todos serán instanciados también. –

+0

Ha pasado un tiempo desde que hice la pregunta, pero IIRC la dificultad fue obtener NSTableCellView desde una punta externa. –

Cuestiones relacionadas