2010-10-20 5 views
0

C'est la première fois que j'essaie d'utiliser typedef. Certes, je n'ai pas une idée très claire de ce qui se passe, mais je crois comprendre que les valeurs de typedef reçoivent des entiers commençant par 0. J'ai essayé de les utiliser comme entiers mais j'ai reçu divers avertissements et erreurs. L'un d'eux est "[NSCFNumber objectForKey:]: sélecteur non reconnu envoyé à l'instance". Je ne sais pas comment résoudre ce problème. Je n'ai pas non plus beaucoup écrit de getters/setters dynamiques, donc mon approche pourrait être fausse. S'il vous plaît aider.Comment utiliser typedef dans les propriétés dynamiques?

// MyView.h 

typedef enum 
{ 
    STYLE_A, 
    STYLE_B, 
    STYLE_C, 
    STYLE_D 
} MyShapeStyle; 


@interface MyView : UIView 
{ 
    MyShapeStyle shapeStyle; 

    CALayer *myLayer; 
    MyLayerDelegate *myLayerDelegate; 
} 

@property (nonatomic) MyShapeStyle shapeStyle; 
@property (nonatomic, retain) CALayer *myLayer; 
@property (nonatomic, retain) MyLayerDelegate *myLayerDelegate; 

@end 

// MyView.m 

#import "MyView.h" 

@implementation MyView 

@dynamic shapeStyle; 
@synthesize myLayer; 
@synthesize myLayerDelegate; 


- (id)initWithFrame:(CGRect)frame 
{ 

    if ((self = [super initWithFrame:frame])) 
    { 
     // Initialization code 
     MyLayerDelegate *delegate = [[MyLayerDelegate alloc] init]; 
     self.myLayerDelegate = delegate; 


     CALayer *myLayer = [CALayer layer]; 
     [myLayer setDelegate:delegate]; 
     [self.layer addSublayer:myLayer]; 
     self.myLayer = myLayer; 
     self.shapeStyle = STYLE_C; 

     [delegate release]; 
    } 

    return self; 
} 

-(MyShapeStyle)shapeStyle 
{ 
    return [[self.myLayer valueForKey:@"style"] integerValue]; 
} 

- (void)setShapeStyle:(MyShapeStyle)style 
{ 
    [self.myLayer setValue:[NSNumber numberWithInt:style] forKey:@"style"]; 
} 

// MyLayerDelegate.m 

-(void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext 
{ 

    int id = [[theLayer valueForKey:@"style"] integerValue]; 

    if(id == STYLE_A) 
    { 
    }else if (id == STYLE_B){ 
    } 

} 

Répondre

1

Il n'y a aucune raison d'utiliser valueForKey: dans ce code; il suffit d'obtenir/définir les différentes propriétés directement.

-(MyShapeStyle)shapeStyle 
{ 
    return (MyShapeStyle) self.myLayer.style; 
} 

Il n'y a pas non plus besoin pour le @dynamic dans ce code. C'est seulement nécessaire si vous allez générer dynamiquement les méthodes.

En ce qui concerne pourquoi l'erreur ne répond pas objectForKey:, il n'y a rien dans ce code qui devrait déclencher cela. Peut être un problème de conservation/relâchement ou un problème dans un autre code que vous n'avez pas montré.

+0

Merci. Vous avez raison "valueForKey" était le code restant d'une implémentation différente. J'ai fait "style" une propriété de MyLayerDelegate. Cependant, j'ai une question à ce sujet. Si je fais "style" tapez "int" tout fonctionne. Mais si je le fais tapez "MyShapeStyle", j'obtiens une erreur "Expected-specifier-qualifier-list avant 'MyShapeStyle'"? – anna

Questions connexes