¿Por qué la creación de una subclass UIGestureRecognizer en una plumilla causa un locking con un UISplitViewController

Estaba interesado en usar una subclass UIGestureRecognizer (UILongPressGestureRecognizer) en una subclass ViewController que tenía. My ViewController tiene un UIToolBar y, mediante progtwigción, puedo crear una instancia de UILongPressGestureRecognizer conectada al UIToolBar y hacer que todo funcione. My ViewController adopta el protocolo UIGestureRecognizerDelegate. En el ViewController tengo:

//My ViewController.h @interface MyViewController: UIViewController<UIGestureRecognizerDelegate> /* ... */ @property (nonatomic, retain) IBOutlet UIToolbar *toolbar; @property (nonatomic, retain) IBOutlet UILongPressGestureRecognizer *longPressGesureRecognizer; /* ... */ - (IBAction)handleGesture; @end 

El siguiente código funciona:

 - (void)viewDidLoad { [super viewDidLoad]; //configure UILongPressGestureRecognizer if(self.longPressGesureRecognizer == nil){ UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture)]; longPress.minimumPressDuration = 1.5; longPress.numberOfTouchesRequinetworking = 1; longPress.delegate = self; self.longPressGesureRecognizer = longPress; [self.toolbar addGestureRecognizer:self.longPressGesureRecognizer]; [longPress release]; } } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return YES; } - (IBAction)handleGesture{ NSLog(@"Got a gesture!"); } 

No creo que realmente necesite el UILongPressGestureRecognizer en mi controller de vista. Cuando intenté crearlo completamente en el file MyViewController.xib, hice lo siguiente usando XCode 4.2

  • Drenado un UILongPressRecognizer en mi UIToolBar en el xib (conectado a la barra de herramientas en MyViewController).
  • Establezca la propiedad delegada de UILongPressRecognizer en el propietario del file
  • Establezca la propiedad de selector en el post handleGesture de MyViewController.

Cuando voy a ejecutar la aplicación en el simulador, locking el siguiente error de gdb en la console:

  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILongPressGestureRecognizer initWithCoder:]: unrecognized selector sent to instance 

Claramente, UILongPressGestureRecognizer initWithCoder: no se impelente, pero me pregunto cuál es la forma correcta de configurar el UIGestureRecognizer en el file xib. XCode tiene gestos allí y lo he conectado a una vista. No veo por qué me estoy equivocando. Todos los enlaces que he visto en UIGestureRecognizer, incluida la reference de class de UIGestureRecognizer de Apple, siempre usan el código UIGestureRecognizer. No he visto un ejemplo usando solo el file xib para configurarlo.

No me preocupa demasiado este problema porque puedo manejarlo con código en el ViewController, pero estoy confundido por qué XCode permite que se agreguen los reconocedores de gestos en la punta si UILongPressGestureRecognizer y / o UIGestureRecognizer no se ajustan al protocolo NSCoding y se llamará a initWithCoder. Mi intuición dice que el problema está en mi final, no en Apple's, pero me encantaría entender qué está yendo mal.

¡Gracias!

Actualizar

Parece que solo veo este comportamiento en las testings cuando uso un UISplitViewController. Si creo un proyecto basado en ViewController, el UIGestureRecognizer funciona como se esperaba. Si agrego un reconocimiento de gestos en el Vista de detalle de una aplicación UISplitViewController, me da un locking como este:

 2011-11-03 10:17:55.873 GestureSplitViewTest[1143:b603] -[UILongPressGestureRecognizer initWithCoder:]: unrecognized selector sent to instance 0x59696b0 2011-11-03 10:17:55.877 GestureSplitViewTest[1143:b603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILongPressGestureRecognizer initWithCoder:]: unrecognized selector sent to instance 0x59696b0' *** Call stack at first throw: ( 0 CoreFoundation 0x011b15a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x01305313 objc_exception_throw + 44 2 CoreFoundation 0x011b30bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x01122966 ___forwarding___ + 966 4 CoreFoundation 0x01122522 _CF_forwarding_prep_0 + 50 5 UIKit 0x002fe9fd UINibDecoderDecodeObjectForValue + 2592 6 UIKit 0x002fe2f5 UINibDecoderDecodeObjectForValue + 792 7 UIKit 0x002ff6ac -[UINibDecoder decodeObjectForKey:] + 398 8 UIKit 0x00214979 -[UIRuntimeConnection initWithCoder:] + 212 9 UIKit 0x003d34a8 -[UIRuntimeOutletCollectionConnection initWithCoder:] + 64 10 UIKit 0x002fe9fd UINibDecoderDecodeObjectForValue + 2592 11 UIKit 0x002fe2f5 UINibDecoderDecodeObjectForValue + 792 12 UIKit 0x002ff6ac -[UINibDecoder decodeObjectForKey:] + 398 13 UIKit 0x00213c36 -[UINib instantiateWithOwner:options:] + 804 14 UIKit 0x00215ab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168 15 UIKit 0x000cb628 -[UIViewController _loadViewFromNibNamed:bundle:] + 70 16 UIKit 0x000c9134 -[UIViewController loadView] + 120 17 UIKit 0x000c900e -[UIViewController view] + 56 18 UIKit 0x000c7482 -[UIViewController contentScrollView] + 42 19 UIKit 0x000d7f25 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48 20 UIKit 0x000d6555 -[UINavigationController _layoutViewController:] + 43 21 UIKit 0x000d7870 -[UINavigationController _startTransition:fromViewController:toViewController:] + 524 22 UIKit 0x000d232a -[UINavigationController _startDefernetworkingTransitionIfNeeded] + 266 23 UIKit 0x001ed2e9 -[UILayoutContainerView layoutSubviews] + 226 24 QuartzCore 0x01888a5a -[CALayer layoutSublayers] + 181 25 QuartzCore 0x0188addc CALayerLayoutIfNeeded + 220 26 QuartzCore 0x018300b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 27 QuartzCore 0x01831294 _ZN2CA11Transaction6commitEv + 292 28 UIKit 0x0001b9c9 -[UIApplication _reportAppLaunchFinished] + 39 29 UIKit 0x0001be83 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690 30 UIKit 0x00026617 -[UIApplication handleEvent:withNewEvent:] + 1533 31 UIKit 0x0001eabf -[UIApplication sendEvent:] + 71 32 UIKit 0x00023f2e _UIApplicationHandleEvent + 7576 33 GraphicsServices 0x00eb2992 PurpleEventCallback + 1550 34 CoreFoundation 0x01192944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 35 CoreFoundation 0x010f2cf7 __CFRunLoopDoSource1 + 215 36 CoreFoundation 0x010eff83 __CFRunLoopRun + 979 37 CoreFoundation 0x010ef840 CFRunLoopRunSpecific + 208 38 CoreFoundation 0x010ef761 CFRunLoopRunInMode + 97 39 UIKit 0x0001b7d2 -[UIApplication _run] + 623 40 UIKit 0x00027c93 UIApplicationMain + 1160 41 GestureSplitViewTest 0x0000234a main + 170 42 GestureSplitViewTest 0x00002295 start + 53 ) terminate called throwing an exceptionshanetworkinglibrary apply-load-rules all Current language: auto; currently objective-c (gdb) 

¿Te has asegurado de que no estás utilizando iOS 4.3 SDK en lugar de iOS 5 SDK?

Pasé unos buenos 30 minutos para descubrir que estaba usando el SDK incorrecto.

Solo requiere colocar el UILongPressRecognizer, luego configurar una IBAction, como

 In H: -(IBAction)LongPress; In M: -(IBAction)LongPress { NSLog(@"Good!"); } 

Última connection a UILongPressRecognizer. ¡Hecho! Probado y funciona.

¡Espero que esto ayude!

No es una buena idea cambiar la versión de SDK como alguien respondió debido a una distribución posterior. No se podrá instalar en dispositivos sin 5.0 SDK.

En lugar de eso, no lo agregue en xib, en lugar de ese código de escritura. Aquí hay un código de muestra de gesto deslizable

Escriba esta parte del código en alguna parte mientras inicializa la vista, por ejemplo, Init

 UISwipeGestureRecognizer *_swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; [_swipeGestureRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft]; [_swipeGestureRecognizer setNumberOfTouchesRequinetworking:1]; [self addGestureRecognizer:_swipeGestureRecognizer]; 

Y también escribe esto para manejar la acción del gesto

 - (void)swipe:(id)sender { ... }