2010-11-25 3 views
1

J'ai créé ChImage de classe de UIImageHériter du problème UIImage

@interface ChImage : UIImage { 
@public 
    int ChannelId; 
    NSString *ChannelName; 
    NSString *Description; 

} 

@property(nonatomic, retain) NSString *ChannelName; 
@property(nonatomic, retain) NSString *Description; 

@end 

@implementation ChImage 


@synthesize ChannelName; 
@synthesize Description; 

@end 

et l'utiliser dans le code:

ChImage *cho = [ChImage imageNamed:img]; 
     cho = [ChImage imageNamed:img]; 
     cho.ChannelName = @"something here..."; 

sur les sauts de ligne d'application cho.ChannelName. J'ai besoin d'étendre UIImage parce que j'ai besoin d'une propriété supplémentaire dans cette classe mais je ne sais pas ce que je fais mal?

Aussi quand j'essaye d'obtenir l'image de UIImageView j'ai eu l'erreur. Je ne sais pas si cela a quelque chose avec problème supérieur:

UIImageView *iw = (UIImageView*) sender; 
    ChImage *im = (ChImage*) iw.image; 

J'essaie juste de jeter dans une autre partie du code et il fonctionne. Le problème doit être dans la méthode de gestion de clic. C'est cette méthode:

- (void)imageTapped:(UIGestureRecognizer *)sender 
{ 
    UIImageView *iw = (UIImageView*) sender; 
    ChImage *im = (ChImage*) iw.image; 
    NSLog(im.ChannelName); 

} 

Becouse ceci est une UIScrollView avec des images à l'intérieur c'est comment j'attachais événement click à chaque image:

for (imageToAdd in arrayOfImages) 
    {    
     UIImageView *temp = [[UIImageView alloc] initWithImage:imageToAdd];  

     temp.frame = CGRectMake(x, y, 29, 29); 
     temp.userInteractionEnabled = YES;  
     x += 29;   

     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)]; 
     [temp addGestureRecognizer:tap];  

     [scrollView addSubview:temp]; 

    } 
+0

Pouvez-vous afficher les journaux de bord? – MathieuF

+0

Terminaison de l'application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '- [UITapGestureRecognizer image]: sélecteur non reconnu envoyé à l'instance 0x5f39d40' – 1110

Répondre

5

Il est recommandé de ne pas sous-classe UIImage , il s'agit d'une couche OO au-dessus de CGImageRef et ont assez de magie impliqué.

Vous pouvez créer une classe wrapper, et faire un a-un au lieu d'une relationest-une relation. Ce qui semble être une bien meilleure approche dans votre cas.

  • Non: Le canal est une image.
  • À la place: le canal a une image.

Comme ceci:

@interface Channel : NSObject { 
@private 
    NSString* _name; 
    NSString* _description; 
    UIImage* _image; 
} 
// The rest… 

Vous devriez probablement changer le nom description car il sera en conflit avec -[NSObject description].

0

Vous envoyez +imageNamed:, mais avez-vous mis en œuvre cette méthode dans votre sous-classe? Si ce n'est pas le cas, le message est transmis à UIImage qui retournera une instance de UIImage, pas ChImage. Depuis le UIImage retourné ne répond pas à ChannelName, votre application se bloque.

Exemple (simplifié) mise en œuvre:

+ (UIImage *) imageNamed: (NSString *) imageName 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource: [imageName stringByDeletingPathExtension] ofType: [imageName pathExtension]]; 
    if (filePath) { 
     ChImage *theImage = [[ChImage alloc] initWithContentsOfFile: filePath]; 
     // configure theImage here if necessary 
     return [theImage autorelease]; 
    } 
    return nil; 
} 

Sinon, vous pourriez envisager de mettre en œuvre un -initWith… initialiseur et l'utiliser pour créer des instances de votre sous-classe.

+0

Comment implémenter cette méthode, y a-t-il un extrait de code? Ce que je considère de plus, c'est que je ne peux pas définir mes propriétés additionnelles :( – 1110

+0

Voir l'exemple d'implémentation dans ma réponse – Costique

+0

Mais cela continue de casser à cette ligne Est-ce que c'est comment faire de l'image depuis UIImageView? ChImage * im = (ChImage *) iw.image; – 1110

0

N'essayez pas de sous-classer et ajoutez la propriété à cela. Au lieu de cela, créez votre propre classe avec NSObject et essayez de résoudre votre problème. Parce qu'il existe un concept appelé cluster de classes dans lequel vous devrez remplacer certaines méthodes de base pour que votre classe fonctionne correctement.

Commander le code I ont placé:

@interface ChImage : NSObject { 
    @public 
    UIImage *yourImage; 
     int ChannelId; 
     NSString *ChannelName; 
     NSString *Description; 

    } 

    @property(nonatomic, retain) NSString *ChannelName; 
    @property(nonatomic, retain) NSString *Description; 
    @property(nonatomic, retain) UIImage *yourImage; 

    @end 




@implementation ChImage 

@synthesize ChannelName; 
@synthesize Description; 
@synthesize yourImage; 

@end 

Et au lieu d'utiliser votre code:

ChImage *cho = [ChImage imageNamed:img]; 
     cho = [ChImage imageNamed:img]; 
     cho.ChannelName = @"something here..."; 

utiliser comme:

ChImage *cho.yourImage = [UIImage imageNamed:img]; 
     cho = [UIImage imageNamed:img]; 
     cho.ChannelName = @"something here...";