2009-02-02 8 views
6

Lo que se considera la mejor manera de manejar múltiples NSTableViews sin utilizar enlaces de cacao?mejor manera de manejar múltiples NSTableView (s)

En mi aplicación, tengo dos NSTableViews que están lo suficientemente relacionados que utilizo el mismo objeto que el delegado y dataSource para ambos. El problema es que tanto tableViews invocan los mismos métodos. Actualmente discrimino entre los dos tableViews en base a NSControl -tag.

Cuanto más profundo me meto en este código, más feo es el uso de -tag. Termino creando código en gran parte duplicado para distinguir entre los tableViews en cada método delegado/dataSource. El código termina siendo claramente no orientado a objetos.

Podría crear un objeto separado para manejar uno u otro tableView, pero la creación de dicho objeto sería una construcción en gran parte artificial solo para proporcionar un delegado/dataSource distinto.

Está todo el mundo simplemente utilizando cacao Vinculaciones ahora? Estoy evitando Enlaces porque me gustaría perfeccionar mis habilidades de Cocoa en técnicas transferibles entre Mac OS y iPhone.

Respuesta

10

Cada método delegado/fuente de datos para NSTableView pasa la instancia de NSTableView que lo llama como el primer parámetro (excepto para los que pasan objetos NSNotification, en cuyo caso object de NSNotification es la instancia de vista de tabla). Algunos ejemplos incluyen:

- (int)numberOfRowsForTableView:(NSTableView*)aTableView;

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification

Si está utilizando un objeto controlador como fuente delegado/datos de varias tablas, sólo puede utilizar este parámetro para diferenciar entre ellos.

+0

Actualmente estoy usando el método NSControl -tag, enviado al argumento tableView que usted señala, para distinguir entre tableViews . Usar -tag parece un poco más definitivo que usar el argumento tableView en sí, ya que tendría que comparar el argumento con algo para determinar el tableView. –

+2

Sí, normalmente también tendrá los enchufes configurados en IB desde su controlador a las vistas de la tabla de todos modos, por lo que puede comparar la vista de tabla pasada con sus puntos de venta para determinar cuál es cuál. –

+1

Esta es la mejor manera de manejarlo. Los métodos de delegado en Cocoa siempre incluyen el objeto de envío por esta misma razón. Si te estás repitiendo a ti mismo, trata de factorizar ese código en un método privado. –

2

Suena como que usted debe utilizar un objeto delegado diferente para cada vista, pero la misma fuente de datos. En otras palabras, un único modelo para distintos objetos de vista y controlador.

No creo que esta sea una distinción artificial porque los objetos tienen propósitos suficientemente diferentes, pero desea utilizar los mismos datos. La regla más grande que está violando ahora es que cada objeto debe tener un único propósito. El objetivo de cada objeto podría ser recuperar y mostrar los datos de una manera específica.

¡Buena suerte!

3

para el método:

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification 

que puede utilizar:

NSTableView *theTable = (NSTableView *)[aNotification object]; 
if(theTable==listeDesMots) 
... 
+0

NSTabView => NSTableView –

+0

Gracias, editado.Y también el lanzamiento '(NSTableView *)', para evitar advertencias de compilación. – tontonCD

Cuestiones relacionadas