Question

Dans mon code je stocke une image dans mon modèle de données de base (travaux de fin). Si je configurer mon avis d'avoir un NSImageView et lier ses données à Key Controller: sélection et modelKeyPath: myImagePath, cela fonctionne. Il montrera chaque image pour la ligne sélectionnée.

Je puis créer une nouvelle colonne dans mon NSTableView et faites glisser une cellule d'image sur la colonne. Cependant, je ne peux pas obtenir mes liaisons de base de données pour avoir le spectacle d'image dans la cellule. J'ai essayé lier à la fois la valeur et des données, mais pas de chance.

Depuis que je suis sûr que l'image est stockée correctement, ce que je fais mal dans mon lien pour empêcher l'image d'apparaître dans la cellule du tableau?

Merci beaucoup.

(Mon arrière-plan. Nouveau développeur Cocoa qui a récemment passé à travers tout le livre Hillegass)

Était-ce utile?

La solution

Je ne sais pas ce qui se passe à cause de votre problème, mais il est un moyen facile de savoir. Accrocher un NSValueTransformer à la liaison. Ensuite, dans ce transformateur, vous pouvez connecter des choses pour savoir si vous passez une valeur nulle, ou vous pouvez transformer votre valeur de données dans un NSImage et passer ce retour ... fondamentalement, vous pouvez faire ce que vous voulez dans la classe du transformateur. Voici que je utilise des données d'image dans un modèle de données de base.

@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

Dans la classe AppController vous initialisez le transformateur:

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

Ensuite, dans Interface Builder vous mettre « DataToImageTransformer » dans pour la liaison. Maintenant, vous avez le contrôle sur la liaison et peut le faire comme je l'ai expliqué plus tôt dans la classe du transformateur. Notez que j'utilise NSKeyedArchiver pour convertir un NSImage aux données et à nouveau, mais vous pouvez utiliser tiffRepresentation ou toute autre méthode que vous voulez à sa place.

Autres conseils

Si quelqu'un a des problèmes avec la technique proposée avec Xcode 6. Je créé un projet Swift, en utilisant l'application à base de documents. Avec un contrôle ImageWell (NSImageView), les liaisons fonctionnent directement sans valeur la nécessité d'un transformateur. Un détail cependant, vous mettre sur la liaison de données de liaison de la vue elle-même, et non pas sur le dessous ImageCell objet.

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