Domanda

Sono bloccato su quella che dovrebbe essere una cosa molto semplice da fare: avere un archivio / visualizzazione di entità dati core (tramite attacchi) un'immagine assegnata come attributo trasformabile.

Ho letto molti post correlati sullo stack (ad esempio, vedi qui e qui), ma ho ancora problemi con esso, dopo aver sviluppato il codice di esempio e studiato altri articoli (ad es. Vedere qui così come qui). Questo è legato al mio precedente domanda, che non ho ancora risolto.

Ho creato una semplice app di dati core basata su DOC per dimostrare il problema. L'oggetto gestito dai dati core è chiamato "thentity" e l'attributo "Theimageatt". L'entità come definita nei dati di base è mostrata di seguito (ImageValueTransformer è NSValueTransformer):
enter image description here

Lascio che Xcode generi l'intestazione della sottoclasse NSManageDObject e i file di implementazione (ho lasciato fuori il codice per l'attributo "Nome" per renderlo più semplice):

//  TheEntity.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "ImageValueTransformer.h"
@interface TheEntity : NSManagedObject
@property (nonatomic, retain) NSImage * theImageAtt;
@end
-----------------------
//  TheEntity.m
#import "TheEntity.h"
@implementation TheEntity
@dynamic theImageAtt;
@end

Di seguito sono riportati i file di intestazione e di implementazione per il mio "ImageValueTransformer". Molti esempi di questo sullo stack e altrove (il rappresentante Tiff è arbitrario).

//  ImageValueTransformer.h
#import <Foundation/Foundation.h>
@interface ImageValueTransformer : NSValueTransformer
@end
-------------------------------
//  ImageValueTransformer.m
#import "ImageValueTransformer.h"
@implementation ImageValueTransformer
+ (BOOL)allowsReverseTransformation {return YES;}
+ (Class)transformedValueClass {
    return [NSData class];  // have also tried: return [NSImage class]; 
}
- (id)transformedValue:(id)value {    
    NSData *data = [value TIFFRepresentation]; 
    return data;
}
- (id)reverseTransformedValue:(id)value {
    NSImage *imageRep = [[NSImage alloc] initWithData:value];
    return imageRep;
}
@end

Il trasformatore di valore può essere inizializzato / registrato allocando un'istanza in mydocument.m, ma alla fine, non importa fintanto che l'intestazione del trasformatore viene importata nell'intestazione di Theentity (vedi sopra). Ho sperimentato questo e non rimuove l'errore che arrivo sotto. Per riferimento, c'è Discussione precedente sul fatto che Il trasformatore di valore deve essere registrato (vedere i commenti di Cornpuff e Brian Webster).

Torna al problema a portata di mano, un buon esempio di codice di Apple è qui Che mostra un'inizializzazione alternativa del trasformatore di valore, ho provato anche quella configurazione.

Mettendolo in azione, ho un metodo per caricare un'immagine di prova e assegnarlo all'attributo trasformabile in mydocument.m (da un'istanza di entità selezionata in un nstable):

- (IBAction)addImg:(id)sender {
    NSImage *theImg = [[NSImage alloc] initWithContentsOfFile:@"/Desktop/testImage.jpg"];
    //[theImageView setImage:theImg]; // as a test, this displays ok
    // "theEntities" below are defined as an IBOutlet to my Array Controller:
    [theEntities setValue:theImg forKeyPath:@"selection.theImageAtt"];
    NSLog(@"after setting the image ..."); // this never logs
}

Zeroing-in su dove si rompe il codice, la riga in basso:

[theEntities setValue:theImg forKeyPath:@"selection.theImageAtt"];

dà l'errore:

Cannot create BOOL from object <4d4d002a 0003717e 8989898a 8a8a8b8b 8b8b8b8b
8a8a8a89 89898888 88878787 8a8a8a89 89898888 88888888 88888889 89898a8a
8a8a8a8a 8b8b8b88 88888787 87898989 8a8a8a89 89898a8a 8a8c8c8c 8b8b8b8a
8a8a8888 .... and so on for the size of the Image array ...

Se commento la suddetta riga sopra, allora il mio Nstable popola benissimo (quindi i binding e il controller dell'array sembrano ok), ma ovviamente senza immagine nella NSIMAGEVIEW.

Come controllo, il codice di conversione utilizzato nel trasformatore di immagini funziona come previsto (questo viene testato separatamente dal trasformatore di valore):

// Image to Data Conversion:
NSImage *imageIn = [[NSImage alloc] initWithContentsOfFile:@"testImage.jpg"];
NSData *imgData = [imageIn TIFFRepresentation];
NSImage *imageOut = [[NSImage alloc] initWithData:imgData];
[theImageDisplay setImage:imageOut]; 

Cosa mi manca su questo?

È stato utile?

Soluzione

Ho scoperto che l'errore sopra riportato, vale a dire

Cannot create BOOL from object ...

Non si verifica quando si utilizza un pozzo di un'immagine o una cella di immagine (sottoclassi di NSIMAGEVIEW) piuttosto che la vista personalizzata a cui stavo cercando di scrivere prima.

Quindi per ora sto usando il trasformatore di valore predefinito anziché un trasformatore di valore personalizzato. Questa è una soluzione praticabile, ma a livello accademico, sarebbe bello sapere perché la vista personalizzata predefinita ha portato a errori quando si è vincolati con un attributo di dati di base (definito come trasformabile nel modello di data core).

Scavando un po 'più in là, l'immagine eredita bene da NSIMAGEVIEW, quindi almeno una differenza è che sono distinti per quanto riguarda la proprietà "modificabile" (i pozzi di immagini sono modificabili che giocano bene con Drag-N-Drop). Quindi, nel tentativo di conciliare questi due, ho impostato la mia vista personalizzata in modifica, pensando che ciò potrebbe risolvere il problema:

theImageView = [[NSImageView alloc] init];
[theImageView setEditable:YES];

Ma deve essere qualcos'altro, questo non risolve l'errore sopra. Per ora almeno ho una soluzione praticabile. Se gli altri dovessero incontrarlo, spero che queste note siano utili!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top