7
votes

Gestion des événements sur un uicontrol personnalisé

Je suis sous-classement uicontrol pour composer un contrôle personnalisé contenant différents contrôles standard.

Pour cette discussion, supposons que mon uicontrol personnalisé contient uniquement un UIBUTTON.

Ce que je voudrais réaliser est que cliquer n'importe où dans la personnalité Uicontrol génère un événement de clic pour cette uicontrol personnalisé. Le comportement standard est que l'UIBUTON traitera et consommera (c'est-à-dire non vers l'avant) de l'événement de clic.

Au sous-classement UIBUTTON est découragé, je ne peux pas vraiment trouver un moyen simple d'atteindre cela.

Toute suggestion?


1 commentaires

Le sous-classement uibutton est-il réellement découragé? Je n'ai vu aucun problème avec celui-ci sur le uibutton référence de classe sauf pour mentionner la touche constructeur ne retournerait pas une instance de la sous-classe.


4 Réponses :


0
votes

UIButton est conçu pour traiter les événements tactiles. Vous pouvez soit définir userinterAcédigAcédenabled à NO pour que le bouton n'accepte aucune touche, ou vous pouvez utiliser addTtarget: action: ForControlevents: sur le bouton pour l'avoir appelé une méthode sur votre classe lorsque le bouton est touché.

BTW, où est le sous-classement Uibutton découragé?


7 commentaires

UIBUTTON est un cluster de classe, qui a tendance à compliquer les choses. Veuillez vous reporter au premier commentaire de la question suivante: Stackoverflow.com/questions/2920045/...


Tout ce que cela signifie est "N'essayez pas d'utiliser BoutonWithType: avec votre sous-classe personnalisée".


Je comprends le but de UserInterActionAcédée et AddTtarget: Action: ForControlvents :. En fait, j'utilise cela sur l'UIBUTTON pour traiter l'événement TouchUpinSide. Ce que je veux aussi faire, cependant, c'est de transmettre l'événement TouchupInside à l'uicontrol personnalisé dans lequel le bouton est positionné. De cette manière, mon contrôle personnalisé peut déclencher une action (par exemple cacher le clavier) lorsque vous cliquez sur si le clic était sur l'UIBUTTON ou ailleurs sur l'UICONTROL.


Donc, si le sous-classement UIBUTTON est une option, je suppose que je pouvais écraser l'envoi: à: Inventent: méthode, elle est donc appelée sur l'UIBUTTON et transmise à l'uicontrol personnalisé.


Je viens d'essayer de sous-classer uibutton et de courir dans des problèmes. En utilisant IB, j'ai ajouté mon uibutton personnalisé à mon uicontrol personnalisé et lui a donné un bouton de bouton de bouton arrondi. Cependant, lors de l'exécution de l'application, il affiche un bouton personnalisé. Comme BoutonType est en lecture seule, je ne vois pas un moyen de résoudre ce problème dans IB. Aucune suggestion?


Qu'est-ce qui ne va pas avec votre registre de contrôle personnalisé pour UicontroleventTouchupinSide sur le bouton?


Rien n'est faux avec ça. J'avais juste besoin d'un moyen de transmettre l'événement à partir de là. J'ai fait cela en utilisant SendactionsForControlvents, qui a résolu mon problème.



0
votes

Souvent, je trouve des tâches liées aux interactions utilisateur utiles dans CLASSE UIREPONDER , qui est la super catégorie de uicontrol - uibutton . LIRE À propos de - TouchSbegan: WithEvent: , - TouchSmoved: WithEvent: , - Touchrésenté: Sans: , - TouchScancéd: winde: < / Code> dans http: // développeur. Apple.com/library/iikit/#documentation/uikit/reference/uireresponder_class/reference/reference.html Vous pouvez trouver des moyens de personnaliser l'interaction utilisateur pour votre uibutton . Au fait, je ne pense pas qu'il y aura un sous-classement problématique uibutton , peu importe ce que vous avez entendu, tant que votre implémentation est correctement ajoutée à la mise en œuvre de Super Class, ou remplacez-la de manière responsable. tout à fait.


0 commentaires

13
votes

J'ai proposé une solution simple qui n'a pas besoin de sous-classement de l'Uibutton.

Dans la méthode d'action définie pour l'événement de contrôle TouchUpinSide de l'UIBUTTON, j'ai ajouté la ligne de code suivante: p>

[self sendActionsForControlEvents:UIControlEventTouchUpInside];


0 commentaires

1
votes

uIView code> s a une méthode appelée -Hittest: withRitTent: code> que le système d'événement utilise pour ramper la hiérarchie de vue et les événements d'expédition sur les sous-espions. Si vous souhaitez une vue parent de gobbler tous les événements pouvant être envoyés autrement à ses sous-visions, il suffit de remplacer le parent -Hittest: Sans: code> avec quelque chose comme ce qui suit:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
  if(CGRectContainsPoint([self bounds], point)){
    return self;
  }
  return [super hitTest:point withEvent:event];
}


0 commentaires