2010-10-12 4 views
2

J'ai un UITableView avec des cellules personnalisées. A l'intérieur de chaque cellule est 2 vues. Chaque vue a un UIGestureRecognizer attaché pour gérer les événements de prise. Lorsque la vue est sélectionnée, j'envoie un message à UINavigationController pour afficher une vue détaillée. Ce scénario fonctionne bien jusqu'à ce que je fasse défiler la table. Après le défilement de la table, l'application se bloque lorsque l'utilisateur tape sur l'une des vues à l'intérieur d'une cellule. Par exemple, je peux charger l'application, cliquer sur une vue dans la 2ème cellule, et obtenir la vue de détail à pousser correctement sur l'écran. De là, je retourne à la table, défile vers le bas, retourne vers le haut et touche la même vue. À partir de là, l'application se bloque avec une erreur de sélection non reconnue. Voici ma configuration pour le geste (en viewDidLoad):UIGestureRecognizer dans UITableView - Crash après défilement?

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                      action:@selector(handleTap:)]; 
[self.view addGestureRecognizer:recognizer]; 
recognizer.delegate = self; 
[recognizer release]; 

Et voici la méthode qui est invoquée:

-(void)handleTap:(UITapGestureRecognizer *)sender{ 
    NSLog(@"Handling tap on ArticleTileViewController"); 
    ArticleViewController *vc = [[ArticleViewController alloc] initWithArticleData:self.articleDataArray]; 
    PROJECTAppDelegate *appDelegate = (PROJECTAppDelegate *)[UIApplication sharedApplication].delegate; 

    [appDelegate.navController pushViewController:vc animated:YES]; 
}[appDelegate.navController pushViewController:vc animated:YES]; 
    } 

Enfin, voici la trace de la pile que je reçois dans la console:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType handleTap]: unrecognized selector sent to instance 0x607ba30' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x02839b99 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x0298940e objc_exception_throw + 47 
    2 CoreFoundation      0x0283b6ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x027ab2b6 ___forwarding___ + 966 
    4 CoreFoundation      0x027aae72 _CF_forwarding_prep_0 + 50 
    5 UIKit        0x0057f060 -[UIGestureRecognizer _updateGestureWithEvent:] + 727 
    6 UIKit        0x0057b8bf -[UIGestureRecognizer _delayedUpdateGesture] + 47 
    7 UIKit        0x00580152 _UIGestureRecognizerUpdateObserver + 637 
    8 UIKit        0x00581464 _UIGestureRecognizerUpdateGesturesFromSendEvent + 51 
    9 UIKit        0x0032a844 -[UIWindow _sendGesturesForEvent:] + 1292 
    10 UIKit        0x003263bf -[UIWindow sendEvent:] + 105 
    11 UIKit        0x00309cb4 -[UIApplication sendEvent:] + 447 
    12 UIKit        0x0030e9bf _UIApplicationHandleEvent + 7672 
    13 GraphicsServices     0x02f07822 PurpleEventCallback + 1550 
    14 CoreFoundation      0x0281aff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
    15 CoreFoundation      0x0277b807 __CFRunLoopDoSource1 + 215 
    16 CoreFoundation      0x02778a93 __CFRunLoopRun + 979 
    17 CoreFoundation      0x02778350 CFRunLoopRunSpecific + 208 
    18 CoreFoundation      0x02778271 CFRunLoopRunInMode + 97 
    19 GraphicsServices     0x02f0600c GSEventRunModal + 217 
    20 GraphicsServices     0x02f060d1 GSEventRun + 115 
    21 UIKit        0x00312af2 UIApplicationMain + 1160 
    22 PROJECT        0x00002459 main + 121 
    23 PROJECT        0x000023d5 start + 53 
    24 ???         0x00000001 0x0 + 1 
) 
terminate called after throwing an instance of 'NSException 

'

EDIT: Après avoir testé avec pendant un certain temps, je l'ai déterminé que seuls les vues t Le chapeau est visible sur l'écran au moment où l'événement se déclenchera. Tout le reste se bloque avec l'erreur ci-dessus. Peut-être lié à this question sans réponse?

Voici ma déclaration d'en-tête (Ivars et propriétés omis pour plus de clarté:

@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> { 

} 

-(void)handleTap:(UITapGestureRecognizer *)sender; 
+0

Quelle classe est 'self' et a-t-elle une implémentation handleTap? – willcodejavaforfood

+0

self est le articleTileViewController, et il contient l'implémentation de la méthode handleTap –

+0

Votre code qui configure le délégué de reconnaissance est-il seulement appelé pour les vues qui sont visibles? – willcodejavaforfood

Répondre

10

Fondamentalement, ce problème signifie que vous envoyez un message à un objet qui ne reconnaît pas le message du tout, à savoir la méthode est . manquant

la création de votre sélecteur est incorrect, il devrait être:

UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 

et

- (void) handleTap:(UITapGestureRecognizer *)sender { 

--UPDATE--

recognizer.delegate = self; 

Je me excuse pour demander, mais êtes-vous sûr que 'soi' a en fait la méthode handleTap:?

+1

Maintenant, je reçois un plantage immédiat lorsque j'appuie sur la vue: - [__ NSCFType handleTap:]: sélecteur non reconnu envoyé à l'instance 0x6271170 2010-10-12 09: 42: 22.505 FLUD [5284: 207] *** Application de terminaison due à exception non interceptée 'NSInvalidArgumentException', raison: '- [__ NSCFType handleTap:]: sélecteur non reconnu envoyé à l'instance 0x6271170' –

+0

mis à jour après vos commentaires :) – willcodejavaforfood

+0

La méthode est déclarée dans mon fichier d'en-tête, et je déclare la classe comme UIGestureRecognizerDelegate dans la déclaration d'interface. Est-ce que je manque quelque chose? –

2

J'ai compris ce que je faisais de mal. Dans mon code d'initialisation (à partir d'un autre ViewController), je libérais les ArticleTileViewControllers après les avoir ajoutés à UITableViewCell. Cela provoquait un message qui n'était plus en mémoire.

Erreur de programmateur stupide !!

0

Vous n'avez pas besoin de définir le délégué sur self si vous ne souhaitez pas implémenter les méthodes déléguées.

UITapGestureRecognizer *touchGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTouchedTheView:)]; 
    [touchGesture setCancelsTouchesInView:NO]; 
    [self.tableView addGestureRecognizer:touchGesture]; 

fonctionnerait également si vous implémentez que userTouchedTheView: méthode.

Questions connexes