Comment utiliser typedef dans les propriétés dynamiques?
-
09-10-2019 - |
Question
Il est la première fois que je suis en train d'utiliser typedef. Il est vrai que je n'ai pas une idée très claire de ce qui se passe, mais je crois comprendre que les valeurs à l'intérieur typedef obtenir attribués entiers commençant par 0. J'ai essayé de les utiliser comme des entiers, mais je reçois différents avertissements et erreurs. L'un d'eux est « [NSCFNumber objectForKey:]: sélecteur non reconnu envoyé à l'instance ». Je ne sais pas comment résoudre cela. J'ai pas écrit getters / setters dynamiques beaucoup, donc mon approche peut-être tort. S'il vous plaît aider.
// 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 ){
}
}
La solution
Il n'y a aucune raison d'utiliser valueForKey:
dans ce code; juste 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 nécessaire que si vous allez générer dynamiquement les méthodes.
Quant à savoir pourquoi le objectForKey:
ne-pas-répondre erreur, il n'y a rien dans ce code qui devrait déclencher cela. Peut-être un retain / numéro de version ou il pourrait être un problème dans un autre code que vous avez pas montré.