Comment associer une IBAction à  une vue personnalisée?

GreensourceGreensource Membre
05:11 modifié dans API UIKit #1
Bonsoir!
Alors voici mon souci, j'aimerais, non pas associer un widget classic (bouton,tableau...) mais une vue personnalisée à  une IBAction.
Mais c'est bizarre j'ai l'impression que ce n'est pas trop possible. En effet lorsque j'essaie de connecter un bouton, pas de souci, par contre j'ai fait une vue (UIView) avec une image dedans, impossible de la connecter! IB ne me propose rien.

Donc voilà , je suis un peu dans l'expectative et ne trouve que peu de doc sur ce problème donc je suppose que je m'y prend comme un manche ^^

Réponses

  • AliGatorAliGator Membre, Modérateur
    05:11 modifié #2
    Fait un sous-classe de UIControl et pas de UIView :
    UIControl is the base class for controls: objects such as buttons and sliders that are used to convey user intent to the application. You cannot use UIControl directly to instantiate controls. It instead defines the common interface and behavioral structure for all subclasses of it.

    The main role of UIControl is to define an interface and base implementation for preparing action messages and initially dispatching them to their targets when specified events occur. (See “The Target-Action Mechanism” for an overview.)
    Tout est indiqué dans la doc de cette classe, y compris comment sous-classer... bonne lecture ;)
  • GreensourceGreensource Membre
    05:11 modifié #3
    Trop bien! Merci beaucoup c'est exactement ce que je cherchais!
  • GreensourceGreensource Membre
    05:11 modifié #4
    Bien, alors certaines choses prennes formes, d'autres coince :crackboom:-
    Toujours au sujet du mécanisme Target-Action:
    J'ai fait une subView de ma Vue principale (mon Board où sont toutes mes cases). Dans cette subView j'ai mis un UIButton "next".
    Ensuite j'ai voulu relier ce bouton à  une méthode du controller. J'ai donc fait:
    [next addTarget:myController action:NSSelectorFromString(@"nextStep") forControlEvents:UIControlEventTouchDown];
    

    Vous l'aurez compris mon action est nextStep et se trouve dans myController.
    Problème lorsque je clique sur le bouton, rien!
    De quoi cela peut-il venir à  votre avis?
  • AliGatorAliGator Membre, Modérateur
    05:11 modifié #5
    1) Vérifie que ta signature de ta méthode est "nextStep" et donc ne prend aucun argument. Si nextStep prend un argument en paramètre, ne pas oublier les ":" dans le nom de la méthode
    2) Préfère utiliser [tt]@selector( nextStep )[tt] que NSSelectorFromString, c'est plus propre

  • GreensourceGreensource Membre
    05:11 modifié #6
    Oui j'ai vérifié, et j'ai même testé avec respondToSelector et pourtant ça ne marche pas.
    Est-il possible que ce soit parce que je ne gère qu'un seul event: UIControlEventTouchDown?
    Mais en même temps c'est bien celui là  quand on fait juste un "Touch" de base?
  • NoNo Membre
    05:11 modifié #7
    Ce que te dis Aligator, c'est que ta méthode  nextStep est mal définie.

    Dans la classe qui implémente myController, la méthode doit être définie comme ça :
    <br />- (void)nextStep:(id)sender<br />{<br />&nbsp;  // des choses à  faire...<br />}<br />
    


    ensuite pour attacher cette action :
    <br />[next addTarget:myController action:NSSelectorFromString(@&quot;nextStep:&quot;) forControlEvents:UIControlEventTouchDown];<br />
    
  • GreensourceGreensource Membre
    mars 2009 modifié #8
    Oui j'ai bien compris, mais j'ai aussi le droit de la définir comme ça:
    - (void)nextStep;
    

    Selon la doc ça devrait marcher:
    - (void)action
    - (void)action:(id)sender
    - (void)action:(id)sender forEvent:(UIEvent *)event


    Et quand bien même j'ai décider d'envoyer le message d'action par programmation:
    <br />                NSLog(@&quot;Select:%d&quot;,[myController respondsToSelector:@selector(nextStep)]);<br />		[next sendAction:@selector(nextStep) to:myController forEvent:NULL];
    

    Et là  aucun souci, le respond me renvois 1 et le sendAction:to:forEvent: marche bien, ça entre bien dans ma méthode "nextStep".

    Où alors c'est moi qui ne comprend pas ce que vous essayez de me dire  :) Ca m'arrive de temps à  autre  ::)


    [edit:] Bon visiblement il y a un problème avec le bouton qui est "derrière" ma vue de plateau, donc c'est elle qui, avec sa méthode touchBegans répond au event...Je vais essayer de changer ça.
  • GreensourceGreensource Membre
    05:11 modifié #9
    Ouais c'est bien ça. Mais pareil, j'ai beau faire bringSubViewToFront pour ma vue StatusBar et pourtant c'est toujours boardView qui recoit les events dans touchBegans. Bizarre non?
Connectez-vous ou Inscrivez-vous pour répondre.