Pregunta

Estoy tratando de establecer un NSCollectionView (he hecho esto con éxito en el pasado, pero por alguna razón falla esta vez).

tengo una clase modelo llamado "TestModel", y tiene una propiedad NSString que sólo devuelve una cadena (solo para propósitos de prueba en este momento). entonces tengo una declaración de propiedad NSMutableArray en mi clase principal aplicación delegado, y para esta matriz agrego instancias del objeto TestModel.

a continuación, tiene un controlador de la matriz que tiene su matriz de contenido vinculado NSMutableArray del delegado de la aplicación. Puedo confirmar que todo lo que hasta aquí se trabaja bien; NSLogging:

[[[arrayController arrangedObjects] objectAtIndex:0] teststring]

muy bien trabajado.

Entonces tenemos todas las fijaciones adecuadas para la vista de colección establecido, (itemPrototype y contenido), y para la linterna Vista de artículos (ver). entonces tengo un campo de texto en la vista de elemento de la colección que está enlazado a la linterna Vista Item.representedObject.teststring. Sin embargo, nada se muestra en la vista de colección cuando inicie la aplicación, sólo una pantalla en blanco en blanco. ¿Qué me falta?

ACTUALIZACIÓN: Aquí es el uso de código I (solicitado por Shipley WIL):

// App delegate class

@interface AppController : NSObject {

NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end

@implementation AppController
@synthesize objectArray;

- (id)init
{
    if (self = [super init]) {
    objectArray = [[NSMutableArray alloc] init];
    }
    return self;
}


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
    if (test) [objectArray addObject:test];
}
@end

// The model class (TestModel)

@interface TestModel : NSObject {
NSString *teststring;
}
@property (readwrite, retain) NSString *teststring;
- (id)initWithString:(NSString*)customString;
@end

@implementation TestModel
@synthesize teststring;

- (id)initWithString:(NSString*)customString
{
    [self setTeststring:customString];
}

- (void)dealloc
{
    [teststring release];
}
@end

Y entonces, como dije la matriz contenido del controlador de la matriz se une a esta "objectArray", y el contenido de la NSCollectionView está obligado a Controller.arrangedObjects matriz. Puedo comprobar que el controlador de la matriz tiene los objetos en él por NSLogging [arrangedObjects arrayController], y se devuelve el objeto correcto. Es sólo que no se muestra nada en la NSCollectionView.

Actualización 2: Si me conecto [Contenido CollectionView] me sale nada:

2009-10-21 08:02:42.385 CollViewTest[743:a0f] (
)

El problema es probablemente allí.

Actualización 3: Conforme a lo solicitado aquí es el proyecto de Xcode:

http://www.mediafire.com/?mjgdzgjjfzw

Su una barra de menú de aplicaciones, por lo que no tiene ventana. Cuando se construye y ejecuta la aplicación verá un elemento de la barra de menú que dice "prueba", esto abre la vista que contiene la NSCollectionView.

Gracias

¿Fue útil?

Solución

El problema es que su no correctamente utilizando KVC. Hay dos cosas que puede hacer.

Método 1: Simple pero no tan elegante

  1. Usar el siguiente código para agregar el objeto a la matriz

[[libre mutableArrayValueForKey: @ "objectArray"] addObject: test];

Esto no es tan elegante como usted tiene que especificar la variable usando un valor de cadena, por lo que no recibirá advertencias del compilador cuando escrito incorrectamente.

Método 2:. Generar los métodos MVA necesarios para la matriz "objectArray"

  1. Seleccione la propiedad en su declaración de interfaz
  2. Seleccione Archivos (el icono de secuencia de comandos en la barra de menús)> Código> Place decls de acceso en el portapapeles
  3. Pegar las declaraciones en el punto apropiado en el archivo de interfaz
  4. Seleccione Archivos> Código> Place defs de acceso en el portapapeles
  5. Pegar las definiciones de la     punto apropiado en el archivo de aplicación

A continuación, se puede utilizar un método que se parece a

[self insertObject:test inObjectArrayAtIndex:0];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top