Question

C’est tellement simple que je suis sûr! Je manque quelque chose et je suis épuisé d'essayer de le réparer. J'espère que quelqu'un pourra vous aider.

Le bouton dans CharacterView.m fonctionne, mais pas le bouton imbriqué dans CharacterMale.m. Je n'utilise pas IB, tout se fait de manière progressive. Qu'est-ce qui ferait fonctionner 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
Était-ce utile?

La solution

FINALEMENT !!!!!!

Je devais initialiser toutes les vues avec initWithFrame et transmettre des données valides. Init doit être utilisé avec les contrôleurs et initWithFrame en transmettant les résultats pour UIViews !!!!

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

Autres conseils

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

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

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

J'ai eu un problème similaire lorsque j'ai 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 j'ai changé le cadre en un rectangle approprié, le bouton a fonctionné:

@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];
  }
}

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

Pour moi, le problème était dû au fait que l'origine du cadre du bouton était plus grande que celle du parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top