2011-03-24 2 views
0

J'ai tous ces subview qui sont sensibles au toucher, je veux envoyer un message de la sous-vue à la superview, pour dire qu'un utilisateur l'a sélectionné, de sorte que le superview peut communiquer avec le reste du contrôleur.Envoi de messages de subview à superview dans Cocoa, UIResponder?

Je ne peux pas communiquer entre les sous-vues et les contrôleurs, subviews >> superview >> contrôleur

Peut-être utiliser, UIResponder pour y parvenir?

Répondre

0

Selon les sous-vues, le mécanisme cible/action peut être bon pour cela. Si vous pouvez dériver vos sous-vues depuis UIControl, il est particulièrement facile d'envoyer vos sous-vues à leur cible, qui est généralement votre contrôleur de vues. Vous pourrez disposer vos vues dans Interface Builder et spécifier leur cible et action en les connectant au contrôleur de vue. Si vous ne pouvez pas les extraire d'UIControl pour une raison quelconque, alors vous devrez implémenter l'équivalent de target/action et vous n'aurez pas le même support dans IB, mais c'est quand même assez simple.

Une autre possibilité consiste à laisser le contrôleur de vue effectuer le traitement tactile pour toutes les sous-vues. Cela profite essentiellement de la chaîne de réponse comme vous l'avez suggéré, mais au niveau du traitement tactile. Ce n'est peut-être pas idéal s'il y a beaucoup de sous-vues à suivre, mais c'est réalisable. Un troisième moyen de le faire est d'avoir vos avis sous forme d'avis une fois qu'ils sont sélectionnés. En tant que tel, UIResponder ne fournit pas un mécanisme pour transmettre des messages arbitraires le long de la chaîne du répondeur. Je ne suis pas sûr que l'ajout de cette fonctionnalité est le moyen le plus élégant d'envoyer un message spécifiquement à partir d'une sous-vue au contrôleur de vue. Il y a potentiellement beaucoup d'objets intermédiaires entre le contrôleur de vue et les sous-vues, et impliquer toute la chaîne quand vous savez déjà où vous voulez que le message aille semble faux. Cependant, il est intéressant de penser à étendre UIResponder pour faire de la chaîne du répondeur un canal pour plus que de simples événements. Vous pouvez ajouter une catégorie à UIResponder:

@interface UIResponder (Messages) 
- (void)sendMessage:(SEL)message withObject:(id)object; 
@end; 

@implementation UIResponder (Messages) 
- (void)sendMessage:(SEL)message withObject:(id)object 
{ 
    if ([self respondsToSelector:message]) { 
     [self performSelector:message withObject:object]; 
    } 
    else { 
     [[self nextResponder] sendMessage:message withObject:object]; 
    } 
} 
@end 

AVERTISSEMENT Le code ci-dessus est tout à fait non testé, et peut-être une mauvaise idée pour des raisons que je ne l'ai pas encore pensé. Procéder avec prudence. Attendez-vous à des erreurs de compilation. Croiser les doigts. S'il vous plaît laissez-moi savoir si cela fonctionne bien, et laissez-moi tranquille si ce n'est pas le cas.

0

Pourquoi ne pouvez-vous pas utiliser [self.superview sendMessage]?

Questions connexes