2012-07-25 3 views
1

J'ai créé une extension pour la classe UIButton. Maintenant, si je l'utilise tout fonctionne bien. Mais j'ai une autre classe qui crée pour moi un tableau avec des objets UIButton et j'ai un problème ici.Problèmes liés à la catégorie UIButton

J'ai la classe Helper avec la méthode qui retourne pour moi tableau avec des objets UIButton.

Dans ViewController.m en rappel viewDidLoad Je demande à ce tableau et aussi ici ViewController.m importer mes UIButton + Extension.m

Donc, maintenant j'ai extension pour chaque objet que je vais UIButton utilise dans ViewController.m

mais si j'utilise l'extension que j'ai erreur sur la méthode qui appellent

[thumbButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:11.0]]; 

mais si je ne l'utilise pas l'extension de cette méthode Invoke correcte.

ceci est mon UIButton + Extension.h fichier

#import <UIKit/UIKit.h> 

@interface UIButton (extension_button) 

- (void)centerButtonToView:(UIView *)view; 
- (UIImage *)cropeImage:(UIImageView *)imageView; 

@end 

c'est mon UIButton + Extension.m fichier

#import "UIButton+Extension.h" 

@implementation UIButton (extension_button) 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)centerButtonToView:(UIView *)view { 
    CGRect rect = view.frame; 
    CGRect rectSelf = self.frame; 
    rectSelf.origin.x = (rect.size.width/2.0f - rectSelf.size.width/2.0f) + rect.origin.x; 
    rectSelf.origin.y = (rect.size.height/2.0f - rectSelf.size.height/2.0f) + rect.origin.y; 
    self.frame = rectSelf; 
} 

- (UIImage *)cropeImage:(UIImageView *)imageView {  
    CGRect rect; 
    rect.origin.x = self.frame.origin.x - imageView.frame.origin.x; 
    rect.origin.y = self.frame.origin.y - imageView.frame.origin.y; 
    rect.size.width = self.frame.size.width; 
    rect.size.height = self.frame.size.height;  
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext();  
    CGRect drawRect = CGRectMake(-rect.origin.x,-rect.origin.y, imageView.image.size.width, imageView.image.size.height); 
    CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height)); 
    [imageView.image drawInRect:drawRect]; 
    UIImage* subImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return subImage; 
} 

@end 

Helper.m (méthode retour tableau pour moi et ici je problème sur la méthode de setFont)

+ (NSMutableArray *)createThumbnailsForCropSize { 

    CGFloat width = 0.0f; 
    CGFloat start_pos = 0.0f; 

    if (IS_IPHONE) { 
     width = 320.0f; 
     start_pos = 62.0f; 
    } 
    else { 
     width = 768.0f; 
     start_pos = 286.0f; 
    } 

    NSMutableArray *arr = [[NSMutableArray alloc] init]; 
    NSArray *resolutionArray = [NSArray arrayWithObjects:@"30x40",@"33x48",@"35x40",@"35x45",@"36x47",@"37x47", 
           @"40x50",@"40x60",@"43x55",@"45x50",@"50x50",@"50x70", nil]; 
    NSInteger pos_x = start_pos; 
    NSInteger page = 0; 
    for (NSInteger idx = 0; idx < 12; idx++) { 
     if (idx%3 == 0 && idx != 0) { 
      page++; 
      pos_x = start_pos + width * page; 
     } 
     UIButton *thumbButton = [[UIButton alloc] init]; 
     [thumbButton setTag:idx]; 
     [thumbButton setFrame:CGRectMake(pos_x, 13, 60, 60)]; 
     [thumbButton setTitle:[NSString stringWithFormat:[resolutionArray objectAtIndex:idx]] forState:UIControlStateNormal]; 
     [thumbButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica" size:11.0]]; 
     [thumbButton setTitle:@"!00" forState:UIControlStateNormal]; 
     [thumbButton setBackgroundImage:[UIImage imageNamed:@"block_without_photo.png"] forState:UIControlStateNormal]; 
     [arr addObject:thumbButton]; 
     pos_x += 68; 
    } 
    return arr; 
} 

Répondre

2

Vous devez supprimer initWithFrame: de votre catégorie. En l'incluant, vous supprimez l'implémentation normale, et cela empêchera la création de vos boutons correctement, vous retournerez en fait un UIControl.

L'appel de la mise en œuvre super dans une catégorie ne pas appel mise en œuvre de l » UIButton de, mais la superclasse de UIButton-UIControl. Les catégories sont différentes des sous-classes. (Et vous ne devriez pas non plus sous-classer UIButton, car c'est un cluster de classe).

Si vous avez un code d'initialisation spécialisé, vous devrez l'ajouter à une méthode séparée et l'appeler pendant votre boucle de création.

+0

oui merci je l'ai fait –

+0

'UIButton' n'est pas un cluster de classe. Sa méthode de classe 'buttonWithType:' pourrait ne pas retourner une instance de votre sous-classe, mais les méthodes de la famille 'init' le feront. –