Question

J'ai un simple NSValueTransformer Cela devrait convertir une chaîne séparée par des virgules first, second, third dans un tableau. Donc, dans mon schéma coredata j'ai l'attribut options que je me suis installé Transformed et spécifiez mon transformateur.

C'est mon transformateur:

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        // return result;
        return @"test Result";
    }
}

Maintenant, quand je retourne la variable result J'obtiens l'erreur suivante (length On dirait qu'il s'attend à un NSString):

... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0'

Si je renvoie la chaîne de test ci-dessus à la place, j'obtiens cette erreur (bytes On dirait qu'il s'attend à un NSData objet):

... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780'

Il semble qu'il y ait un problème conceptuel que je ne semble pas saisir. Aussi curieusement +(Class)transformedValueClass et +(BOOL)allowsReverseTransformation ne sont jamais "touchés" lors de l'utilisation du débogueur.

Était-ce utile?

La solution

Il n'y a pas d'erreurs dans le code que vous fournissez. Le problème réside dans votre approche coredata.

Lorsque vous utilisez une propriété transformée dans coredata, la valeur est stockée dans la base de données comme Nsdata objet. Et la longueur de vos erreurs est liée à Longueur nsdata méthode.

Par conséquent, vous devez fournir à NSvalutRansformateur avec une transformation de NSDATA en NSARRAY et inverser pour mettre des tableaux concaténés en coredata comme nsdata.

Si vous souhaitez conserver la possibilité de stocker la propriété en tant que NSString, vous pouvez implémenter un accessoire spécial sur la propriété NSString de votre objet géré, qui transformera le NSString en valeur NSARAY ou utilisera votre NSValuetRansformateur en dehors de votre modèle de coredata comme ceci:

NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];

Autres conseils

La valeur doit être jetée à un nsstring essayez ceci

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = (NSString*)value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        return result;

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