Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITapGestureRecognizer crashes on multiple taps

I am adding UIImageView into UIScrollView programmatically and adding a tap gesture on imageView. It recognizes the tap event exactly 4 times and on fourth time it crashes without any clear error message. This is in the controller named FeaturedListingDetailVC

Code:

let frame = CGRect(x: 0, y: 0, width: 128, height: 128)
_iv = UIImageView(frame: frame)
_iv.image = UIImage(named: "no_media")            
_iv.userInteractionEnabled = true

tapGesture = UITapGestureRecognizer(target: self, action: #selector(initImagePopup(_:)))
_iv.addGestureRecognizer(tapGesture)

_iv.widthAnchor.constraintEqualToConstant(CGFloat.init(128)).active = true
_iv.heightAnchor.constraintEqualToConstant(CGFloat.init(128)).active = true
hrScroll.addSubview(_iv)

Function Called on Tap:

@objc func initImagePopup(gesture: UITapGestureRecognizer) {
    print("I am tapped!!!")
}

Moreover, the way I load my target viewController (i.e. FeaturedListingDetailVC) really matters but I don't know why and how. Because when I push my target viewController into UINavigationViewController, it crashes on the first tap otherwise when I initialize target VC by presentation viewController it crashes on the 4th tap.

Crashes on First Tap When Initialized With Following Code:

let storyboard = UIStoryboard(name: "Post", bundle: nil)
let featuredVC = storyboard.instantiateViewControllerWithIdentifier("FeaturedListingDetailVC") as! FeaturedListingDetailVC
self.vc?.navigationController!.pushViewController(featuredVC, animated: true)

Crashes on 4th Tap When Initialized With Following Code:

let storyboard = UIStoryboard(name: "Post", bundle: nil)
let featuredVC = storyboard.instantiateViewControllerWithIdentifier("FeaturedListingDetailVC") as! FeaturedListingDetailVC
self.vc?.navigationController!.presentViewController(featuredVC, animated: true, completion: nil)

Backtrace:

* thread #1: tid = 0x78c3e, 0x0000000106365553 UIKit\`-[UIViewController(UIKitManual) release] + 122, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
    frame #0: 0x0000000106365553 UIKit\`-[UIViewController(UIKitManual) release] + 122
    frame #1: 0xfffffffee7368160
    frame #2: 0x0000000105bf72f3 UIKit\`-[UIViewController setChildModalViewController:] + 248
    frame #3: 0x0000000105be853e UIKit\`-[UIViewController dealloc] + 1329
    frame #4: 0x0000000105f48b31 UIKit\`_UIGestureRecognizerSendTargetActions + 162
    frame #5: 0x0000000105f4519a UIKit\`_UIGestureRecognizerSendActions + 162
    frame #6: 0x0000000105f43197 UIKit\`-[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 843
    frame #7: 0x0000000105f4b655 UIKit\`___UIGestureRecognizerUpdate_block_invoke898 + 79
    frame #8: 0x0000000105f4b4f3 UIKit\`_UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 342
    frame #9: 0x0000000105f38e75 UIKit\`_UIGestureRecognizerUpdate + 2634
    frame #10: 0x0000000105ac548e UIKit\`-[UIWindow _sendGesturesForEvent:] + 1137
    frame #11: 0x0000000105ac66c4 UIKit\`-[UIWindow sendEvent:] + 849
    frame #12: 0x0000000105a71dc6 UIKit\`-[UIApplication sendEvent:] + 263
    frame #13: 0x0000000105a4b553 UIKit\`_UIApplicationHandleEventQueue + 6660
    frame #14: 0x00000001046f2301 CoreFoundation\`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    frame #15: 0x00000001046e822c CoreFoundation\`__CFRunLoopDoSources0 + 556
    frame #16: 0x00000001046e76e3 CoreFoundation\`__CFRunLoopRun + 867
    frame #17: 0x00000001046e70f8 CoreFoundation\`CFRunLoopRunSpecific + 488
    frame #18: 0x000000010bf6ead2 GraphicsServices\`GSEventRunModal + 161
    frame #19: 0x0000000105a50f09 UIKit\`UIApplicationMain + 171
  * frame #20: 0x0000000103e34b22 JaClassified\`main + 114 at AppDelegate.swift:5
    frame #21: 0x000000010886b92d libdyld.dylib\`start + 1
    frame #22: 0x000000010886b92d libdyld.dylib\`start + 1
like image 783
umair151 Avatar asked May 02 '16 12:05

umair151


1 Answers

Sounding strange, I've tested a lot your code, and there is no way, always crashes.

So I simply tried changing name of callback method:

 func didTapOnImagePopup(recognizer: UITapGestureRecognizer) {}

And it works.

I really don't know why and I can find any reasonable explanation.

The only thing that I can think is that should exists an internal function called "initImagePopup".. but it's strange.

I'm really curious on the real explanation, if someone know it.

like image 176
Luca Davanzo Avatar answered Oct 16 '22 07:10

Luca Davanzo