Objective-C Personnalisé Getter / Setter
Je suis en utilisant le suivant NSManagedObject qui a été généré automatiquement par Xcode:
@interface Portion : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * volume;
Je voudrais créer un getter/setter pour convertir entre ml/oz en fonction de ce que l'utilisateur a défini, de cette façon, la base de données stocke toujours la même valeur et il est automatiquement converti en parts privilégiées. Ma dernière tentative ressemble à ceci:
#import "Portion.h"
#import "SettingHandler.h"
#define MILLILITERS_PER_OUNCE 29.5735296
@implementation Portion
@dynamic volume;
- (void) setVolume:(NSNumber *) number {
if ([SettingHandler getUnitsTypeShort] == @"oz") {
[self setValue:number forKey:@"volume"];
} else {
[self setValue:[NSNumber numberWithFloat:[number floatValue] * MILLILITERS_PER_OUNCE] forKey:@"volume"];
}
}
- (NSNumber *) volume {
if ([SettingHandler getUnitsTypeShort] == @"oz") {
return [self valueForKey:@"volume"];
} else {
return [NSNumber numberWithDouble: [[self valueForKey:@"volume"] floatValue] * MILLILITERS_PER_OUNCE];
}
}
La setVolume la fin de l'appel en appelant lui-même provoque une boucle infinie. Je devine qu'il y a un moyen de le faire, mais je ne sais pas ce que c'est, des idées?
le tdfp. tu veux sans doute dire quelque chose comme:
[@"oz" isEqualToString:[SettingHandler getUnitsTypeShort]]
au lieu de:[SettingHandler getUnitsTypeShort] == @"oz"
OriginalL'auteur Winder | 2010-11-10
Vous devez vous connecter pour publier un commentaire.
Découvrez "Attribut personnalisé et À Une Relation Méthodes Accesseur" dans la Base de Données Guide de Programmation. Fondamentalement, vous devez utiliser la primitive getter/setter pour accéder/modifier la valeur et l'envelopper ces appels avec KVO notifications.
Vous aurez besoin d'ajouter les déclarations de la primitive accesseurs:
Ensuite, vous devez remplacer chaque occurrence de:
avec:
Et de faire les modifications correspondantes dans la lecture.
OriginalL'auteur Tim Isganitis
Désolé pour jouer l'avocat du diable, mais l'OMI, il semble que vous essayez d'aborder la façon dont la valeur est affichée à l'utilisateur à la trop faible d'un niveau (dans le modèle objet lui-même; voir Le Modèle-Vue-Contrôleur Modèle De Conception). Pourquoi ne pas utiliser un formateur qui travaille plus au niveau de la vue à l'aide du format raw NSNumber de la valeur à une chaîne de caractères qui sera présenté à l'utilisateur?
Vous auriez alors une classe réutilisable vous pouvez utiliser n'importe où vous utilisez une valeur numérique qui représente un volume. Le formateur serait de stocker un "unitsType" valeur, de sorte qu'il serait de savoir comment faire pour formater le numéro entrant correctement.
J'ai fait une version rapide en utilisant l'un de mes formateurs, MDFileSizeFormatter, comme un point de départ:
Alors la .m fichier:
Cela pourrait être élargi pour faire des tests sur la valeur entrante et de déterminer automatiquement le volume approprié de l'unité. Par exemple, si le floatValue était de 16,0, vous pourriez utiliser si la logique de retourner une chaîne de "2.0 tasses" au lieu de 16 oz.
OriginalL'auteur NSGod
Essayez d'utiliser
[self setPrimitiveValue:number forKey:@"volume"];
à la place.OriginalL'auteur John Franklin
Je suggère encore une autre approche. Décider sur la représentation canonique - soit en onces ou en millilitres. Ce sera ce volume est en fait stockée en tant que. Ensuite déclarer, à l'getters/setters:
Si l'canonique volume en millilitres, puis:
OriginalL'auteur westsider