2010-10-21 9 views
4

J'ai sous-classes UIControl et ce que je vous envoie:La sous-classe UIControl ne peut pas prendre de cible?

[self sendActionsForControlEvents:UIControlEventValueChanged]; 

Lorsque je crée une instance de l'objet, j'ajouter une cible comme suit:

[starView addTarget:self action:@selector(starRatingChanged:) forControlEvents:UIControlEventValueChanged]; 

La vue apparaît bien, et sans que la cible soit là, la fonctionnalité fonctionne bien. Mais avec l'ajout de la cible, il se bloque. Des idées pourquoi?

Ma classe est déclarée avec:

@interface RMStarRating : UIControl {...} 

Pour ce qu'il vaut la peine, je mis en place mon point de vue en - (void)layoutSubviews. Y at-il une autre méthode que j'ai besoin de sous-classer pour que les cibles soient sauvées correctement ou pour que les cibles soient envoyées les bonnes actions? Je pensais que UIControl gérait les objectifs et les actions pour vous.

MISE À JOUR: en essayant de fournir plus d'informations

Je mets l'objet comme suit:

RMStarRating *starView = [[RMStarRating alloc] initWithFrame:CGRectMake(10, 70, 23*5, 30)]; 
[starView addTarget:self action:@selector(starRatingChanged:) forControlEvents:UIControlEventValueChanged]; 
.... 
[self.view addSubview:starView]; 

Mon sendAction, selon la suggestion de la Jordanie:

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { 
    NSLog(@"send action"); 
    [super sendAction:action to:target forEvent:event]; 
} 

Ma fonction qui appelle sendActionsForControlEvents :

- (void)updateValue:(UITouch *)touch { 
    .... 
    NSLog(@"sendActionsForControlEvents"); 
    [self sendActionsForControlEvents:UIControlEventValueChanged]; 
} 

Et la fonction qui doit être appelée (et il est dans l'en-tête aussi):

- (void)starRatingChanged:(id)sender { 
    NSLog(@"star rating changed"); 
} 

Et le journal juste recrache:

2010-10-22 09:45:41.348 MyApp[72164:207] sendActionsForControlEvents 
2010-10-22 09:45:41.350 MyApp[72164:207] send action 

Le débogueur a:

debugger picture

+0

Pourquoi se bloque-t-il? Quelle ligne de code? Que dit la pile d'appel? Il peut être difficile de diagnostiquer des accidents de manière spéculative. –

+0

Je ne sais pas pourquoi c'est tombé en panne, c'est ce que j'essaie de savoir. Il se bloque sur sendActionsForControlEvents: (sauf si j'implémente la réponse de Jordan, auquel cas il se bloque pendant celui-ci). Quelque chose ne va pas entre la connexion de l'UIController et ma classe, je pense. Et le journal ne crache rien quand il meurt. – RyanJM

Répondre

0

Ok, je me suis dit ce qu'il était. Je libérais ma classe parente trop tôt, donc il n'y avait aucun objet pour que le message soit renvoyé, même s'il était affiché à l'écran.

Et j'ai fini par ne pas avoir besoin de sendAction: to: forEvent.

Jordan, merci pour votre aide.

+0

lol - voir, cela aide si vous publiez tout le code, au lieu de snippets. Difficile de dire ce qui se passe réellement. Je suis content que vous l'aillez compris. – Jordan

0

Avez-vous essayé d'implémenter

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event 

à la place? Un bon exemple est situé ici:

Can I override the UIControlEventTouchUpInside for a UISegmentedControl?

+0

Merci pour ce lien. Malheureusement, le passage sur super n'a pas fonctionné. sendAction: to: forEvent est appelé, mais se bloque toujours. – RyanJM

+0

Ensuite, vous avez un autre problème. Publiez le journal de plantage, au moins, et le code avec sendAction et setup. – Jordan

+0

J'ai posté plus d'informations, j'espère que cela aide. Par le journal des accidents, vous voulez dire le journal de développement, n'est-ce pas? – RyanJM

Questions connexes