UIGestureRecognizer in UITableView - Crash dopo lo scorrimento?
-
29-09-2019 - |
Domanda
Ho un UITableView con celle personalizzati. All'interno di ogni cella è 2 viste. Ogni vista ha un UIGestureRecognizer attaccato ad eventi maniglia rubinetto. Quando la vista è sfruttato, mando un messaggio a un UINavigationController per spingere una vista di dettaglio. Questo scenario funziona bene fino a quando ho effettivamente scorrere la tabella. Dopo che la tabella viene fatto scorrere, l'applicazione si blocca quando l'utente tocca su una delle viste all'interno di una cellula. Ad esempio, posso caricare l'applicazione, cliccare su una vista nel 2 ° cellulare, e ottenere la visualizzazione dei dettagli di essere spinto sullo schermo in modo corretto. Da lì, torna accedere alla tabella, scorrere verso il basso, torna, e toccare la stessa vista. Da lì, l'applicazione si blocca con un errore di selezione non riconosciuto. Qui è la mia messa a punto per il gesto (in viewDidLoad):
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleTap:)];
[self.view addGestureRecognizer:recognizer];
recognizer.delegate = self;
[recognizer release];
E qui è il metodo che viene richiamato:
-(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];
}
Infine, ecco la traccia dello stack salgo in 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: Dopo aver testato con questo per un po ', ho stabilito che solo i punti di vista che sono visibili sullo schermo al momento spareranno l'evento. Tutto il resto si blocca con l'errore precedente. Possibilmente correlate al questa domanda senza risposta ?
Ecco la mia dichiarazione di intestazione (Ivars e le proprietà omesse per chiarezza:
@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> {
}
-(void)handleTap:(UITapGestureRecognizer *)sender;
Soluzione
In pratica questo significa problemi che si sta inviando un messaggio a un oggetto che non riconosce il messaggio a tutti, vale a dire il metodo è mancante.
La vostra creazione di selezione non è corretta dovrebbe essere:
UIGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
e
- (void) handleTap:(UITapGestureRecognizer *)sender {
- UPDATE -
recognizer.delegate = self;
Mi scuso per chiedere, ma sei sicuro che 'sé' è in realtà il metodo handleTap:
?
Altri suggerimenti
ho capito quello che stavo facendo male. Nel mio codice di inizializzazione (da un altro ViewController), stavo rilasciando l'ArticleTileViewControllers dopo li ho aggiunto al UITableViewCell. Questo causava un oggetto da messaged che non era più in memoria.
Stupido programmatore errore !!
Non è necessario impostare il delegato per sé se non si desidera implementare i metodi delegato.
UITapGestureRecognizer *touchGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTouchedTheView:)];
[touchGesture setCancelsTouchesInView:NO];
[self.tableView addGestureRecognizer:touchGesture];
potrebbe anche funzionare se implementare solo userTouchedTheView:. Metodo