2010-10-20 9 views

Répondre

1

Je devais juste déplacer toute la logique qui était dans layoutSubviews au constructeur.

+0

J'ai le même problème mec, pouvez-vous coller votre code de solution pl? –

0

Assurez-vous que vous faites quelque chose comme ceci:

 UIButton *btn = [UIButton buttonWithType: UIButtonTypeCustom]; 
     btn.frame = CGRectMake(0, 0, 100, 40); 
     [btn setTitle:@"Click Me" forState: UIControlStateNormal]; 
     [btn setBackgroundColor: [UIColor blackColor]]; 
     [btn setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]; 
     [btn addTarget:self action:@selector(buttonTap:) forControlEvents: UIControlEventTouchUpInside]; 
     [self.view addSubview:btn]; 

Cela va créer un bouton qui appelle la méthode buttonTap quand on clique dessus.

+1

La cible est une méthode de contrôleur de vue. J'ajoute la cible pour le bouton dans le contrôleur de vue. Mon problème est le UIControlEvent n'est pas "enregistré". –

+0

Postez votre code. Peut-être que nous (la communauté Stack Overflow) pouvons trouver le bug en le regardant. – Axeva

+0

mon code est ci-dessous. –

0

Voici la vue personnalisée et la logique du contrôleur de vue

// affichage personnalisé

@implementation CustomUIASView 

@synthesize firstButton; 
@synthesize secondButton; 
@synthesize thirdButton; 

- (id)initWithFrame:(CGRect)frame { 

if ((self = [super initWithFrame:frame])) { 

    self.alpha   = .85; 
    self.backgroundColor = [UIColor blackColor]; 
} 

    return self; 
} 


- (void)layoutSubviews { 

    UIImage *buttonImageNormal; 
    UIImage *stretchableButtonImageNormal; 
// 
    buttonImageNormal   = [UIImage imageNamed:@"as-bg.png"]; 
    stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 

    self.firstButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

    self.firstButton.frame   = CGRectMake(10, 10, 300, 50); 
    self.firstButton.backgroundColor = [UIColor clearColor]; 

    [self.firstButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal]; 
    [self.firstButton setTitle:@"Watch Video" forState:UIControlStateNormal]; 
    [self.firstButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 

    self.firstButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f]; 

    [self addSubview:self.firstButton]; 

    self.secondButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

    self.secondButton.frame   = CGRectMake(10, (10 + 50 + 5), 300, 50); 
    self.secondButton.backgroundColor = [UIColor clearColor]; 

    [self.secondButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal]; 
    [self.secondButton setTitle:@"Save to My Favorites" forState:UIControlStateNormal]; 
    [self.secondButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 

    self.secondButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f]; 

    [self addSubview:self.secondButton]; 

    self.thirdButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

    buttonImageNormal   = [UIImage imageNamed:@"social-button-bg.png"]; 
    stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 

    self.thirdButton.frame   = CGRectMake(10, (secondButton.frame.origin.y + secondButton.frame.size.height + 5), 300, 50); 
    self.thirdButton.backgroundColor = [UIColor clearColor]; 

    [self.thirdButton setTitleColor:RGB(16,62,30) forState:UIControlStateNormal]; 
    [self.thirdButton setTitle:@"Share with Friends on" forState:UIControlStateNormal]; 
    [self.thirdButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; 
    [self.thirdButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; 

    CGRect thirdButtonFrame = thirdButton.titleLabel.frame; 

    self.thirdButton.titleLabel.font = [UIFont boldSystemFontOfSize:16.0f]; 
    self.thirdButton.titleEdgeInsets = UIEdgeInsetsMake(thirdButtonFrame.origin.x, thirdButtonFrame.origin.y + 20, 0, 0); 

    [self addSubview:self.thirdButton]; 

    [super layoutSubviews]; 
} 

- (void)dealloc { 
    [firstButton release]; 
    [secondButton release]; 
    [thirdButton release]; 
    [super dealloc]; 
} 

@end 

// vue extrait contrôleur

self.uiasView = [[CustomUIASView alloc] initWithFrame:CGRectMake(0, (self.view.frame.size.height + 270), kDefaultFrameWidth, 300)]; 

[self.uiasView.firstButton addTarget:self action:@selector(pushToRunwayViewController:) forControlEvents:UIControlEventTouchUpInside]; 

[self.view addSubview:self.uiasView]; 

"pushToRunwayViewController" est jamais appelé

+2

J'ai oublié de poster ma solution. Tout fonctionne, j'ai juste besoin de supprimer toute la logique de layoutSubviews à initWithFrame. Maintenant, la méthode dans mon contrôleur est appelée. –

+0

Les méthodes view cycle de vie et delegate sont inhabituelles. Merci d'avoir posté cette solution, j'avais le même problème et cela l'a étouffé. Je suppose que layoutSubviews est appelé après la méthode viewControllers viewDidLoad. +1 – atreat

0

Vous ne savez pas si vous avez compris par vous-même, mais quand vous ajoutez arget: self à votre firstButton, self est votre vue personnalisée réelle, pas le contrôleur de vue. Donc, si vous déplacez votre méthode (pushToRunwayViewController) vers CustomAISView, tout devrait fonctionner comme prévu.

J'espère que cela aide. Rog

+0

fait référence au contrôleur de vue. Le but de mon exercice était de créer une «feuille d'action» personnalisée qui serait utilisée dans toute l'application sans lier l'implémentation spécifique du contrôleur. Avoir à mettre le pushToRunwayViewController dans la classe aurait brisé cette abstraction. Cependant j'ai tout fait fonctionner (voir le commentaire ci-dessus). Je posterai bientôt un blog à ce sujet. –

-1

Premièrement, UIView est différent de UIControl. UIView ne sait pas comment traiter différentes interactions utilisateur et n'implémente pas la plupart des méthodes de gestion des événements.

UIControl fait cela pour vous. Sa sous-classe notable est UIButton. Essayez de sous-classer UIControl pour obtenir toutes les méthodes de gestion des événements. Pour une manière plus complexe, à l'intérieur de cette sous-classe de UIView sous-classe un autre UIControl mais je ne pense pas que ce soit une bonne idée.

Plus un peu la gestion des événements de pointe et le passage de messages à ce regard:

How to add UIViewController as target of UIButton action created in programmatically created UIView?

Questions connexes