Pregunta

Tengo un UITableView con células personalizados. Dentro de cada celda es de 2 puntos de vista. Cada vista tiene una UIGestureRecognizer unido a eventos manija del grifo. Cuando se toca la vista, puedo enviar un mensaje a un UINavigationController para empujar una vista de detalle. Este escenario funciona bien hasta que realmente desplazar la tabla. Después se desplaza la mesa, la aplicación se bloquea cuando los grifos de usuario en una de las vistas dentro de una célula. Por ejemplo, puedo cargar la aplicación, haga clic en una vista en la segunda celda, y obtener la vista de detalle que se inserta en la pantalla correctamente. A partir de ahí, me regreso localizar la tabla, de desplazamiento hacia la parte inferior, de nuevo a la parte superior, y toque en el mismo punto de vista. A partir de ahí, la aplicación se bloquea con un error de selección no reconocido. Aquí está mi configuración para el gesto (en viewDidLoad):

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

Y aquí es el método que se invoca:

-(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]; 
    }

Por último, aquí está el seguimiento de la pila me meto en la consola:

*** 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: Después de probar con esto durante un tiempo, he determinado que sólo los puntos de vista que son visibles en la pantalla en el momento van a desencadenar el evento. Todo lo demás se bloquea con el error anterior. Posiblemente relacionadas con esta pregunta sin respuesta

Esta es mi declaración de cabecera (Ivars y propiedades omitidas para mayor claridad:

@interface ArticleTileViewController : UIViewController<UIGestureRecognizerDelegate> {

}

-(void)handleTap:(UITapGestureRecognizer *)sender;
¿Fue útil?

Solución

Básicamente, esto significa problemas que le está enviando un mensaje a un objeto que no reconoce el mensaje en absoluto, es decir, el método que se echa en falta.

Su creación de selección no es correcta debería ser:

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

y

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

- ACTUALIZACIÓN -

recognizer.delegate = self;

Me disculpo por preguntar, pero ¿estás seguro de que 'yo' tiene en realidad el método handleTap:?

Otros consejos

me di cuenta de lo que estaba haciendo mal. En mi código de inicialización (de otro ViewController), que estaba liberando los ArticleTileViewControllers después de que les añade a la UITableViewCell. Esto causaba un objeto que se envió un mensaje que ya no estaba en la memoria.

Error estúpido programador !!

no es necesario para establecer el delegado a la libre si no desea implementar los métodos de delegado.

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

también funcionaría si solo aplicar userTouchedTheView:. Método

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top