Domanda

Nel mio codice sto memorizzando un'immagine in mio modello Core Data (funziona bene). Se ho impostato la mia fine di avere un NSImageView e impegnare i suoi dati a Key controller: selezione e modelKeyPath: myImagePath, funziona. Mostrerà ogni immagine per la riga selezionata.

I quindi creare una nuova colonna nella mia NSTableView e trascinare una cella di immagine sulla colonna. Tuttavia, non posso ottenere i miei attacchi Core Data di avere lo show immagine in alto nella cella. Ho provato vincolante sia il valore e dati, ma senza fortuna.

Dato che io sono sicuro che l'immagine viene memorizzata correttamente, cosa sto facendo di sbagliato nel mio vincolante per evitare che l'immagine da mostrare nella cella di una tabella?

Grazie mille.

(La mia formazione:. Nuovo sviluppatore di cacao che ha recentemente attraversato l'intero libro Hillegass)

È stato utile?

Soluzione

Non sono sicuro di quello che sta succedendo a causare il problema, ma c'è un modo semplice per scoprirlo. Collegare un NSValueTransformer alla rilegatura. Allora in quel trasformatore è possibile accedere roba per scoprire se si sta passando un valore pari a zero, oppure si può trasformare il vostro valore dei dati in un NSImage e passare che di nuovo ... in fondo si può fare quello che vuoi nella classe trasformatore. Ecco quello che ho l'uso su dati di immagine in un modello core-dati.

@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

In classe AppController si inizializza il trasformatore:

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

Poi in Interface Builder si mette "DataToImageTransformer" in per la rilegatura. Ora avete il controllo sul legame e può fare come ho spiegato in precedenza nella classe trasformatore. Si noti che sto usando NSKeyedArchiver per convertire un NSImage ai dati e viceversa, ma è possibile utilizzare tiffRepresentation o qualsiasi altro metodo che si desidera al suo posto.

Altri suggerimenti

Se qualcuno sta avendo problemi con la tecnica suggerita con Xcode 6. Ho creato un progetto Swift, utilizzando l'applicazione basata documento. Con un controllo ImageWell (NSImageView), attacchi funzionano direttamente senza valore la necessità di un trasformatore. Un dettaglio, però, ha messo voi vincolante per associazione dei dati della vista in sé, non sul ImageCell objet sotto di essa.

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