Tengo un controlador de árbol vinculado a una matriz, llamado "contenido". "contenido" es una matriz de objetos modelo, denominada "Coche". Cada "Coche" contiene un NSString llamado "carName" y un NSMutableArray llamado "mostPopularColors". "mostPopularColors" contiene objetos NSMutableDictionary con claves como: "más popular", "segundo más popular", "tercero más popular", etc. y valores como: "rojo", "verde", "azul", etc.

Una vista de esquema está vinculada a los objetos organizados del controlador de árbol y muestra el "carName" de cada "Car" en "content". Una vista de tabla separada enumera todos los "carName" en una columna. Esto se hace teniendo un controlador de matriz vinculado al controlador de árbol (clave de controlador: selección, ruta de clave de modelo: allChildLeafs). El valor de la columna de la tabla se vincula a los objetos dispuestos del controlador de matriz, ruta de clave de modelo: carName.

En la vista de tabla, quiero otras dos columnas que enumeren el color más popular y el segundo color más popular, respectivamente. Por lo tanto, la tabla final debe tener tres columnas que enumeren todos los nombres de los automóviles junto con los dos colores más populares de cada automóvil.

Puedo acceder a los nombres de los coches como se describe, pero no a los colores, ya que ellos mismos están en matrices.

He intentado hacer un segundo controlador de matriz y vincularlo al primero, pero no puedo hacer que funcione.

Entonces, al final, quiero poder seleccionar un automóvil o automóviles en la vista de esquema y ver todos sus nombres y los dos colores superiores de cada uno en la vista de tabla.

0
A A 28 nov. 2011 a las 19:26

1 respuesta

La mejor respuesta

Parece que el segundo controlador de matriz no funcionó porque no es posible conectar dos controladores de matriz a una vista de tabla.

El controlador de matriz que estaba vinculado al controlador de árbol (clave de controlador: selección, ruta de clave de modelo: allChildLeafs) se dejó en su lugar pero no se vinculó a ninguna vista.

En Xcode, se creó un IBOutlet NSArrayController y luego se conectó a un controlador de matriz recién creado en Interface Builder (IB). Además, se declaró un nuevo NSMutableArray, con métodos setter y getter. Luego, se usó el siguiente código para vincular el controlador de matriz al nuevo NSMutableArray:

[newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"mutableArray" options:nil];

Así que ahora el controlador de la matriz "retendría" lo que estuviera en la nueva matriz mutable. El contenido de la matriz se puede mostrar en una vista de tabla conectando el nuevo controlador de matriz a una vista de tabla.

Todo lo que se necesitaba era hacer que esta matriz mutable contuviera un objeto NSMutableDictionary para cada automóvil. Cada diccionario tendría tres pares clave-valor. Las tres claves serían: "carName", "mostPopularColor", "secondMostPopularColor".

Dado que el controlador de matriz antiguo contenía la matriz de objetos "Car" actualmente seleccionados en la vista de esquema, esto se hizo obteniendo primero esa matriz de objetos "Car". Para hacer esto, se observaron cambios en los objetos organizados del controlador de matriz anterior y se observó la nueva matriz de objetos "Coche" usando:

[oldArrayController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:nil];

Para manejar la observación y usar la nueva matriz de objetos "Car" para obtener la matriz final de objetos de diccionario, se implementó el siguiente método:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  {if (object == selectedChildLeafsController)
{
    if ([[object arrangedObjects] count] > 0)
    {//make a new mutable array, here called "array", of dictionaries from your array of "Car" objects which is found in [object arrangedObjects] . And then something like...
    [self setMutableArray: array];
    [newArrayController bind:NSContentArrayBinding toObject:self withKeyPath:@"selectedBonds" options:nil];}else
{
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}}
0
A A 4 dic. 2011 a las 16:26