Question

Je suis coincé sur ce qui est censé être une chose très simple à faire: avoir une boutique / affichage d'entité de données de base (via les liaisons) une image attribuée comme un attribut transformable.

J'ai lu de nombreux articles connexes sur la pile (par exemple, voir ici et ici), mais j'ai toujours des problèmes avec cela, après avoir développé un exemple de code et recherché d'autres articles (par exemple, vois ici aussi bien que ici). Ceci est lié à mon précédent question, ce que je n'ai toujours pas résolu.

J'ai créé une application de base de base de doc basée sur DOC pour démontrer le problème. L'objet géré de données de base est appelé "Theentity" et l'attribut "TheImageAtt". L'entité telle que définie dans les données de base est indiquée ci-dessous (ImageValutRansformateur est le nsvalutransformateur):
enter image description here

Je laisse Xcode générer l'en-tête de sous-classe NSManagedObject et les fichiers d'implémentation (j'ai laissé de côté le code pour l'attribut "Name" pour le rendre plus simple):

//  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

Vous trouverez ci-dessous l'en-tête et les fichiers d'implémentation pour mon "ImageValutRansformrer". Beaucoup d'exemples de cela sur la pile et ailleurs (le représentant TIFF est arbitraire).

//  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

Le transformateur de valeur peut être initialisé / enregistré en allouant une instance de celui-ci dans MyDocument.m, mais en fin de compte, peu importe tant que l'en-tête du transformateur est importé dans l'en-tête de l'entrée (voir ci-dessus). J'ai expérimenté cela et cela ne supprime pas l'erreur que j'obtiens en dessous. Pour référence, il y a Discussion antérieure sur si Le transformateur de valeur doit être enregistré (voir les commentaires de Cornpuff et Brian Webster).

Retour au problème à accomplir, un bon exemple de code d'Apple est ici Ce qui montre une autre initialisation du transformateur de valeur, j'ai essayé cette configuration également.

En mettant cela en action, j'ai une méthode pour charger une image de test et l'attribuer à l'attribut transformable dans myDocument.m (à partir d'une instance d'entité sélectionnée dans 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
}

Zéro-in où se casse le code, la ligne ci-dessous:

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

Donne l'erreur:

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 ...

Si je commente ladite ligne ci-dessus, mon NSTABLE apparaît très bien (donc les liaisons et le contrôleur de tableau semblent corrects), mais bien sûr sans image dans le NSimageView.

En tant que vérification, le code de conversion utilisé dans le transformateur d'image fonctionne comme prévu (il est testé séparément du transformateur de valeur):

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

Qu'est-ce que je manque à ce sujet?

Était-ce utile?

La solution

J'ai trouvé que l'erreur signalée ci-dessus, à savoir,

Cannot create BOOL from object ...

Ne se produit pas lors de l'utilisation d'une image ou d'une cellule d'image (sous-classes de NSimageView) plutôt que de la vue personnalisée à laquelle j'essayais d'écrire plus tôt.

Donc pour l'instant j'utilise le transformateur de valeur par défaut plutôt qu'un transformateur de valeur personnalisé. Il s'agit d'une solution réalisable, mais académiquement parlant, il serait bien de savoir pourquoi la vue personnalisée par défaut a conduit à des erreurs lors de la liaison à un attribut de données de base (défini comme transformable dans le modèle de date de base).

En creusant un peu plus loin, l'image hérite bien de NsimageView, donc au moins une différence est qu'elles sont distinctes en ce qui concerne la propriété "modifiable" (les puits d'image sont modifiables qui se déroule bien avec Drag-n-Drop). Donc, dans une tentative de réconcilier ces deux-là, j'ai défini ma vue personnalisée sur modifiable, pensant que cela pourrait résoudre le problème:

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

Mais ce doit être autre chose, cela ne résout pas l'erreur ci-dessus. Pour l'instant au moins, j'ai une solution réalisable. Si d'autres en rencontrent cela, j'espère que ces notes seront utiles!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top