2010-09-20 4 views
1

En règle générale lors de la création d'une action de quelque chose comme un bouton que vous avez cetteSelector envoyé au parent au lieu de l'auto

[button addTarget:self action:@selector(method:)... 

Je suppose que si je veux envoyer l'action à une autre classe, mais si je veux envoyer au parent? Je pensais que super pourrait fonctionner, mais cela donne un avertissement.

EDIT: Et super crashes l'application

Vive toute aide.

Répondre

0

La façon dont je comprends votre question, vous essayez de mettre en œuvre quelque chose qui fait exactement la Même chose que le modèle délégué, mais la façon dont vous le contournez n'obtiendra pas d'astuces ou d'erreurs de compilation si la super classe n'implémente pas la méthode correcte pour la cible, elle se bloquera simplement lorsque vous l'exécuterez.

Cela peut sembler une bonne idée en ce qui concerne l'encapsulation, mais je pense qu'il serait difficile de déboguer si vous réutilisez le composant de vue ailleurs. Le seul cas où j'utilise l'approche consistant à essayer de signaler autre chose que "soi" est celui où un ViewController a des vues X et ces vues ont besoin l'une de l'autre et doivent réagir aux actions des autres. Cependant, si j'ai implémenté un viewController en tant que délégué pour les vues, je laisserais simplement le viewController changer les autres vues selon l'état où elles devraient aller.

(espoir que je ne l'ai pas mal compris la question)

+0

Je pense que c'est probablement le meilleur dans mon cas. – Rudiger

7

Supposons que vous avez les classes suivantes:

@interface Base { 
} 
- (IBAction)method:(id)sender; 
@end 

@interface Derived { 
} 
@end 

Si dérivée ne dispose pas de son propre implémentation de method: alors votre configuration standard avec self et @selector(method:) fera ce que vous voulez.

Si Dérivé a sa propre implémentation de method: alors vous n'avez pas d'autre choix que d'ajouter votre propre méthode en dérivée qui ne fait que transférer l'appel jusqu'à l'implémentation de la superclasse.

- (void)callMethodOnSuper:(id)sender { 
    [super method:sender]; 
} 

Utilisez ensuite @selector(callMethodOnSuper:) à la place. Vous ne pouvez pas fournir super comme cible.

EDIT: Ce qui suit est une mise à jour basée sur le commentaire ci-dessous clarifiant réellement ce que l'OP veut faire. Pour vous assurer que je suis clair, je vais réaffirmer ce que vous semblez être votre situation. Vous avez un contrôleur de vue, disons MyViewContoller, dont la vue a trois sous-vues. Une de ces sous-vues, une MyCustomView, a des sous-vues UIButton.

Ma suggestion est la suivante:

@interface MyViewController { 
} 
@end 

@interface MyCustomView { 
    UIButton* button1; 
    UIButton* button2; 
} 
@property (nonatomic,readonly,retain) UIButton* button1; 
@property (nonatomic,readonly,retain) UIButton* button2; 
@end 

Lorsque votre contrôleur de vue est la construction, il est vue:

[myCustomView.button1 addTarget:self action:@selector(method:)... 
[myCustomView.button1 addTarget:self action:@selector(method:)... 
+0

Cela est logique et cela pourrait être dû à une mauvaise décision de conception, mais quand je l'appelle [méthode super: expéditeur]; l'application se bloque lorsqu'elle envoie l'appel à elle-même, et non à son parent.Comme une note, je n'utilise pas IB, il est créé dans Derived, mais devrait répondre à la base – Rudiger

+0

Peut-être que vous pouvez poster une partie de votre code réel, parce que cela fonctionne très bien pour moi. – imaginaryboy

+0

Il y a probablement un peu trop de code mais ce que je fais est: j'ai un contrôleur de vue qui a 3 vues. J'ai sous-classé l'une de ces vues pour implémenter un drawRect personnalisé. Comme il est unique à la vue, je me suis dit que je créerais les boutons qui appartiennent à cette vue là aussi, mais il devrait répondre au parent de la vue. J'espère que cela a du sens et je n'utilise pas de termes incorrects. – Rudiger