2010-01-26 5 views
0

J'ai créé une sous-classe (appelée MyPicture) du UIImageView avec cette Methodes:Mon UIImageView ne reçoit pas toutes les méthodes de mon sous-classé UIImageView

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"-- I AM TOUCHED --"); 
} 

// ...

Lorsque je crée un UIImageView avec InterfaceBuilder avec la classe MyPicture tout fonctionne et la console écrit: "I AM TOUCHED". Mais seulement, quand j'active l'interaction utilisateur activée dans IB. Mais quand je crée le programme UIImageView, cela fonctionne bien. dans le ViewController.h:

MyButton * foo; 

Dans le ViewController.m:

- (void)viewDidLoad { 
    flo = [[UIImageView alloc]initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)]; 
    foo.userInteractionEnabled = YES; 
    foo.image = [UIImage imageNamed:@"Picture 1.png"]; 
    [self.view addSubview:foo]; 
    [super viewDidLoad]; 
} 

je peux voir l'image, il doit être ma sous-classe UIImageView. Mais pourquoi ne détecte-t-il pas les touches?

Répondre

4

Je ne vois pas pourquoi cela doit être votre sous-classe. Voir l'image signifie simplement que c'est un UIImageView. Ce qui est exactement ce qu'il est (pas la sous-classe) ici:

foo = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)]; 

vous initialisez un UIImageView, pas votre sous-classe. Essayez de changer cette ligne à:

foo = [[MyPicture alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)]; 

Edit: En outre, étant donné que vous définissez userInteractionEnabled = OUI dans vos sous-classes « initWithFrame: » méthode, il n'y a aucune raison que vous devez le faire à nouveau dans cette ligne:

foo.userInteractionEnabled = YES; 
+0

Merci, maintenant cela fonctionne. Je l'ai essayé bevore avec [MyPicture alloc], mais l'application a planté. Mais comme je l'ai dit, maintenant ça marche. – Flocked

1

Lorsque vous sous-classez UIImageView, l'application peut appeler l'objet de deux manières différentes. Les UIImageViews créés dans Interface Builder sont pré-compilés et chargés en mémoire sans appeler une méthode -(id)init. Au lieu de cela, ils appellent - (void)awakeFromNib après le chargement du contenu de la plume en mémoire.

Assurez-vous que votre identité de classe est définie sur votre sous-classe et définissez userInteractionEnabled dans la méthode awakeFromNib de votre sous-classe. Cela vous permettra de définir l'interaction de l'utilisateur sans liaison.

Pour charger complètement UIImageView par programme, assurez-vous que vous allouez à partir de la bonne classe. Votre code appelait de la superclasse UIImageView.

- (void)viewDidLoad { 
    foo = [[MyImageView alloc] initWithFrame:CGRectMake(0.0, 45.0, 324, 52.0)]; 
    foo.image = [UIImage imageNamed:@"Picture 1.png"]; 
    [self.view addSubview:foo]; 
    [super viewDidLoad]; 
} 

Ceci appellera la - (id)initWithFrame de votre sous-classe au lieu de la superclasse et exécuter votre code personnalisé. Cela envoie également les appels - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event à votre sous-classe au lieu de la superclasse.

Questions connexes