2009-05-04 5 views
11

C'est tellement simple im sûr! Je manque quelque chose et je suis épuisé d'essayer de le réparer. J'espère que quelqu'un peut aider.Iphone UIButton ne fonctionne pas dans UIViews imbriqués

Le bouton dans CharacterView.m fonctionne mais le bouton imbriqué dans CharacterMale.m ne fonctionne pas. Je n'utilise pas IB tout est fait progmatiquement. Qu'est-ce qui provoquerait le fonctionnement d'un bouton et d'autres pas?

///////////////////////////////////////////////////////////////////////////////// 
CharacterController.m 
///////////////////////////////////////////////////////////////////////////////// 
#import "CharacterController.h" 
#import "CharacterView.h" 

@implementation CharacterController 

- (id)init { 
    NSLog(@"CharacterController init"); 
    self = [ super init ]; 
    if (self != nil) { 
    } 
    return self; 
} 

- (void)loadView { 
    [ super loadView ]; 
    characterView = [ [ CharacterView alloc ] init]; 
    self.view = characterView; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

@end 

///////////////////////////////////////////////////////////////////////////////// 
CharacterView.m 
///////////////////////////////////////////////////////////////////////////////// 

#import "CharacterView.h" 
#import "CharacterMale.h" 

@implementation CharacterView 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     characterMale = [ [ CharacterMale alloc ] init]; 
     [self addSubview: characterMale]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0, 200, 200, 100); 
     [button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside]; 
     [ self addSubview: button ]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
} 

-(void)ApplyImage:(id)sender 
{ 
    NSLog(@"CharacterView button works"); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

///////////////////////////////////////////////////////////////////////////////// 
CharacterMale.m 
///////////////////////////////////////////////////////////////////////////////// 

#import "CharacterMale.h" 
#import "CharacterController.h" 

@implementation CharacterMale 

- (id)init { 
    self = [ super init]; 
    if (self != nil) { 
     UIImage *image = [UIImage imageNamed:@"charMale.png"]; 
     imageView = [[ UIImageView alloc] initWithImage:image]; 
     [image release]; 
     [ self addSubview: imageView ]; 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(0, 0, 200, 100); 
     [button setImage:[UIImage imageNamed:@"btnCharSelect.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(ApplyImage:) forControlEvents:UIControlEventTouchUpInside]; 
     [ self addSubview: button ]; 

    } 
    return self; 
} 

-(void)ApplyImage:(id)sender 
{ 
    NSLog(@"CharacterMal button works"); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 
+0

Que voulez-vous dire que vos boutons ne fonctionnent plus? Sont-ils activés mais n'appellent pas les sélecteurs ou ne pouvez-vous pas les cliquer du tout? Aussi comment les raccordez-vous aux sélecteurs? Si vous utilisez IB, vérifiez les prises et les connexions – nduplessis

+1

Je ne peux pas cliquer sur le bouton du tout, rien ne se passe. Si je prends la classe View, le bouton est situé hors de son parent Voir le bouton le travail. Je n'utilise pas IB. Je connecte le bouton en utilisant: [bouton addTarget: self action: @selector (ApplyImage :) forControlEvents: UIControlEventTouchUpInside]; Encore une fois cela fonctionne bien quand il n'est pas imbriqué dans une autre vue. –

+0

J'ai posté tous les 3 classes. Quelqu'un peut-il aider? –

Répondre

17

FINALEMENT !!!!!!

J'ai dû initialiser toutes les vues avec initWithFrame et passer dans des rects de trame valides. Init devrait être utilisé avec les contrôleurs et initWithFrame passant des rects pour UIViews !!!!

characterView = [ [ CharacterView alloc ] initWithFrame:CGRectMake(0, 0, 480, 320)]; 
then 
characterMale = [ [ CharacterMale alloc ] initWithFrame:frame]; 
+11

@Roger Parce que d'autres pourraient avoir le même problème. Vous ne supprimez pas simplement une question quand elle est résolue ... – Emil

2

La nouvelle vue accepte-t-elle l'interaction de l'utilisateur? En d'autres termes, userInteractionEnabled est-il activé sur la vue "Caractères"?

+0

Je pensais avoir lu userInteractionEnabled par défaut est OUI. Je penserais dans cette situation que je ferais userInteractionEnabled = NO pour la classe CharactersView. Je pense que cette vue bloque le bouton de ma classe CharactersMale. En tout cas j'ai essayé et pas de différence. –

+1

J'ai une vue qui contient un tas de boutons. J'ajouteVoir une nouvelle vue avec quelques-uns de ses propres boutons sur ceux qui étaient là. Tous les boutons fonctionnent, y compris ceux entre la première couche et la deuxième couche (supérieure). Donc je ne devrais pas avoir de problèmes pour imbriquer les boutons. Mais si je désactive userInteraction dans la superLayer, tous les boutons cessent de fonctionner. Si je ne désactive que la commande userInteraction dans la couche supérieure, elle n'a désactivé que le bouton de cette couche. Continuez.Je parie que vous trouverez une erreur simple ou plus. – mahboudz

17

Une autre chose à considérer est que les sous-vues UIButton qui ont été ajoutées un UIImageView ne fonctionnent pas du tout. Vous devez créer un UIView que vous ajoutez à la fois l'affichage de l'image et les boutons.

Ceci est probablement dû au fait que l'interaction est désactivée par défaut sur les vues d'image, mais je ne l'ai pas vérifié.

+2

Kay, Merci pour le conseil. J'ai placé UIImageView suerInteractionEnabled à oui et cela a fonctionné. –

+0

+ 1 merci merci, j'ai résolu mon problème bizarre – Kalle

1

J'ai eu un problème similaire quand essayé d'ajouter le bouton lors de l'initialisation d'un UIView avec un cadre de CGRectZero:

@implementation SomeView 
... 
- (id)initWithTitleImage:(UIImage *) newTitleImage { 
    // BROKEN: frame with CGRectZero. 
    self = [super initWithFrame:CGRectZero]; 
    if (self) { 
    UIButton *someButton = ...; 
    [self addSubview someButton]; 
    } 
} 

Une fois que je l'ai changé le cadre d'un rectangle approprié, le bouton travaillé:

@implementation SomeView 
... 
- (id)initWithTitleImage:(UIImage *) newTitleImage { 
    // WORKING: frame with proper CGRect. 
    self = [super initWithFrame:CGRectMake(0, 0, 480, 320)]; 
    if (self) { 
    UIButton *someButton = ...; 
    [self addSubview someButton]; 
    } 
} 
1

J'ai eu la chance avec un sélecteur pour un UIButton créé en drawRect en utilisant UIControlEventTouchDown au lieu du UIControlEventTouchUpInside populaire.

1

Pour moi, le problème a été causé parce que, l'origine de l'image du bouton était plus grande que l'image parent.