Pregunta

En mi código que estoy almacenando una imagen en mi modelo de Datos Básicos (funciona bien). Si puedo configurar mi punto de vista para tener una NSImageView y unen sus datos al controlador Clave: selección y modelKeyPath: myImagePath, funciona. Se mostrará cada imagen para la fila seleccionada.

a continuación, crear una nueva columna en mi NSTableView y arrastre una celda de imagen en la columna. Sin embargo, no puedo conseguir mis fijaciones de Datos Básicos de tener la imagen muestran en la célula. He tratado tanto de valor como de datos, pero no hubo suerte vinculante.

Desde que estoy seguro de que la imagen se almacena correctamente, ¿qué estoy haciendo mal en mi unión a evitar que la imagen aparezcan en la celda de tabla?

Muchas gracias.

(Mi formación:. Revelador nuevo cacao que recientemente ha pasado a través de todo el libro Hillegass)

¿Fue útil?

Solución

No estoy seguro de lo que está ocurriendo a causa de su problema, pero hay una manera fácil de averiguar. Conectar un NSValueTransformer a la unión. Luego, en que el transformador puede conectarse cosas para averiguar si estás pasando un valor nulo, o se puede transformar su valor de datos en un NSImage y pasadas de vuelta ... básicamente se puede hacer lo que quiera en la clase transformador. Aquí hay una que el uso de datos de imagen en un modelo de núcleo-datos.

@interface DataToImageTransformer : NSValueTransformer {

}

@end


@implementation DataToImageTransformer

+ (Class)transformedValueClass {
    return [NSImage class];
} // the class of the return value from transformedValue:

+ (BOOL)allowsReverseTransformation {
    return YES;
} // if YES then must also have reverseTransformedValue:

- (id)transformedValue:(id)value {
    if (value == nil || [value length] < 1) return nil;
    NSImage* i = nil;
    if ([value isKindOfClass:[NSData class]]) {
        i = [NSKeyedUnarchiver unarchiveObjectWithData:value];
    }
    return i;
}

- (id)reverseTransformedValue:(id)value {
    if (value == nil) return nil;
    NSData* d = nil;
    if ([value isKindOfClass:[NSImage class]]) {
        d = [NSKeyedArchiver archivedDataWithRootObject:value];
    }
    return d;
}

@end

En la clase AppController inicializar el transformador:

+ (void)initialize {
    DataToImageTransformer *transformer = [[DataToImageTransformer alloc] init];
    [NSValueTransformer setValueTransformer:transformer forName:@"DataToImageTransformer"];
    [transformer release];
}

A continuación, en el Interface Builder se puso "DataToImageTransformer" en la unión. Ahora usted tiene control sobre la unión y se puede hacer como he explicado anteriormente en la clase transformador. Tenga en cuenta que estoy usando NSKeyedArchiver para convertir un NSImage a los datos y volver de nuevo, pero se puede utilizar tiffRepresentation o cualquier otro método que desea en su lugar.

Otros consejos

Si alguien está teniendo problemas con la técnica sugerida con Xcode 6. He creado un proyecto Swift, utilizando la aplicación basada en documentos. Con un control ImageWell (NSImageView), fijaciones trabajan directamente y sin valor la necesidad de un transformador. Un detalle, sin embargo, puesto que la unión de enlace de datos de la vista en sí, no en el ImageCell objet debajo de ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top