J'ai une UIButton personnalisée ajoutée en tant que sous-vue à une sous-classe UIView. Dans mon viewController, j'ajoute le uiview personnalisé comme sous-vue à la vue du contrôleur. Ensuite, j'essaie d'ajouter une cible à uibutton (à l'intérieur de viewWillLoad), mais le sélecteur n'est jamais appelé.Ajout d'une cible pour UIButton ajoutée à la sous-classe UIView ne fonctionnant pas sur UIViewController
Répondre
Je devais juste déplacer toute la logique qui était dans layoutSubviews au constructeur.
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.
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é". –
Postez votre code. Peut-être que nous (la communauté Stack Overflow) pouvons trouver le bug en le regardant. – Axeva
mon code est ci-dessous. –
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é
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. –
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
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
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. –
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?
- 1. ne peut pas accéder à UIView à partir de UIViewController
- 2. Effacement des avertissements "ne répond pas" pour UIView et UIViewController
- 3. Ajout d'une sous-classe UIView avec xib à UIViewController
- 4. Ajout d'un UIButton à UIScrollView
- 5. Ajout d'un UIView sous l'écran
- 6. UIImage de UIView à UIViewController
- 7. Ne peut pas déclencher IBAction d'un UIButton de UIView
- 8. Taille de la cible UIButton
- 9. UIView vs UIViewController
- 10. Méthode d'appel définie comme cible sur UIButton
- 11. Forcer l'orientation UIView/UIVIewController
- 12. Ajout d'un UIButton à gauche d'un UISearchBar?
- 13. Ajout d'une uiview à un contrôleur d'image
- 14. ne peut pas désactiver UIButton
- 15. Ajouter un UIview à un UIViewController
- 16. Pratique UIView et UIViewController pour l'héritage
- 17. UIViewController avec UIView personnalisé
- 18. UIViewController ne répondant pas à presentModalViewController pour la navigation modale
- 19. Personnalisé UIViewController ne répond pas à la rotation des périphériques
- 20. Générateur d'interface Image d'arrière-plan personnalisée UIButton ne fonctionnant pas sur simulateur/périphérique
- 21. Ajout ombre contour à un UIView compatible
- 22. jQuery DatePicker ne fonctionne pas sur la ligne nouvellement ajoutée
- 23. UIButton sur UIScrollView ne peut pas fonctionner
- 24. UIButton dans UIView dans UITableView = ne peut pas cliquer sur le bouton
- 25. Filtrage sur RadGrid ne fonctionnant pas
- 26. Position fixe ne fonctionnant pas sur l'ipad
- 27. Superposition d'un UIView sur un UINavigationBar et un UIViewController
- 28. Ajout UIButton en dehors de l'écran
- 29. Comment ajouter une action à un bouton dynamique dans un contrôle UIView pour revenir à UIViewController
- 30. Inflections personnalisées ne fonctionnant pas sur rails3?
J'ai le même problème mec, pouvez-vous coller votre code de solution pl? –