2016-05-02 18 views
6

Ich füge programmgesteuert UIImageView in UIScrollView hinzu und füge eine Tippgeste auf imageView hinzu. Es erkennt das Tipp-Ereignis genau 4 Mal und beim vierten Mal stürzt es ohne eine eindeutige Fehlermeldung ab. Dies ist in der FeaturedListingDetailVC namens ControllerUITapGestureRecognizer stürzt bei mehreren Tippfehlern ab

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) 

Funktion auf Tap Called:

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

Darüber hinaus ist die Art, wie ich mein Ziel laden Viewcontroller (zB FeaturedListingDetailVC) ist wirklich wichtig, aber ich weiß nicht warum und wie. Denn wenn ich mein Ziel-ViewController in UINavigationViewController verschiebe, stürzt es beim ersten Antippen ab, andernfalls wenn ich Ziel-VC durch Darstellung von ViewController initialisiere, stürzt es beim vierten Antippen ab.

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

Crashes am 4. Tippen Sie, wenn sie mit folgendem Code Initialized:

Crashes on First Tap, wenn sie mit folgendem Code Initialized

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 
+0

Haben Sie versucht, es zu debuggen? "Crash" ist nicht wirklich eine gute Beschreibung des Problems! – luk2302

+0

Können Sie Backtrace posten? –

+0

Stellen Sie sicher, dass Sie den Beobachter entfernen, wenn Sie ihn nicht mehr benötigen. Es stürzt wahrscheinlich ab, weil Sie ein Ereignis an ein Objekt senden, das nicht mehr existiert. – Daniel

Antwort

3

Sounding seltsam, ich habe viel getestet Ihren Code, und es gibt keinen Weg, stürzt immer ab.

Also versuchte ich einfach Namen Callback-Methode zu ändern:

func didTapOnImagePopup(recognizer: UITapGestureRecognizer) {} 

Und es funktioniert.

Ich weiß wirklich nicht warum und ich kann jede vernünftige Erklärung finden.

Das einzige, was ich denke, ist, dass sollte eine interne Funktion namens "initImagePopup" existiert .. aber es ist seltsam.

Ich bin wirklich neugierig auf die wahre Erklärung, wenn jemand es weiß.

+0

Ah! Ich könnte mir das nie vorstellen. Es hat meinen ganzen Tag gegessen. Danke @Luca – umair151

+0

Ich auch nicht .. aber es wäre interessant zu verstehen, warum! –