2016-07-12 14 views
0

Ich versuche, eine Tappgeste zu einem generierten Bild hinzuzufügen und es funktioniert gut, aber stürzt das Programm ab, wenn ich auf das Bild klicke. Was habe ich hier falsch gemacht? Jede Hilfe wird geschätzt.swift Verwandle eine generierte imageView in eine UIButton in Code

let tapGesture = UITapGestureRecognizer(target: self, action: "image Tapped") 
      let imageView = UIImageView(image: UIImage(data: data)); 
      imageView.addGestureRecognizer(tapGesture) 
      imageView.userInteractionEnabled = true 

Dies ist der Fehler, den ich

2016-07-12 09:19:30.241 XXX[2170:27661] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ‘-[MyViewController image Tapped]: unrecognized selector sent to instance 0x7fe811e30560' 
*** First throw call stack: 
(
0 CoreFoundation      0x000000010e2a7d85 __exceptionPreprocess + 165 
1 libobjc.A.dylib      0x000000011144ddeb objc_exception_throw + 48 
2 CoreFoundation      0x000000010e2b0d3d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
3 CoreFoundation      0x000000010e1f6cfa ___forwarding___ + 970 
4 CoreFoundation      0x000000010e1f68a8 _CF_forwarding_prep_0 + 120 
5 UIKit        0x0000000110391b28 _UIGestureRecognizerSendTargetActions + 153 
6 UIKit        0x000000011038e19a _UIGestureRecognizerSendActions + 162 
7 UIKit        0x000000011038c197 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 843 
8 UIKit        0x0000000110394655 ___UIGestureRecognizerUpdate_block_invoke898 + 79 
9 UIKit        0x00000001103944f3 _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 342 
10 UIKit        0x0000000110381e75 _UIGestureRecognizerUpdate + 2634 
11 UIKit        0x000000010ff0e48e -[UIWindow _sendGesturesForEvent:] + 1137 
12 UIKit        0x000000010ff0f6c4 -[UIWindow sendEvent:] + 849 
13 UIKit        0x000000010febadc6 -[UIApplication sendEvent:] + 263 
14 UIKit        0x000000010fe94553 _UIApplicationHandleEventQueue + 6660 
15 CoreFoundation      0x000000010e1cd301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
16 CoreFoundation      0x000000010e1c322c __CFRunLoopDoSources0 + 556 
17 CoreFoundation      0x000000010e1c26e3 __CFRunLoopRun + 867 
18 CoreFoundation      0x000000010e1c20f8 CFRunLoopRunSpecific + 488 
19 GraphicsServices     0x0000000112d68ad2 GSEventRunModal + 161 
20 UIKit        0x000000010fe99f09 UIApplicationMain + 171 
21 ApivitaClient      0x000000010d6a1482 main + 114 
22 libdyld.dylib      0x0000000111f1192d start + 1 
23 ???         0x0000000000000001 0x0 + 1 

) erhalten libC++ abi.dylib: mit abgefangene Ausnahme vom Typ Abschluss NSException (LLDB)

Antwort

2

ersetzen

let tapGesture = UITapGestureRecognizer(target: self, action: "image Tapped")

mit

let tapGesture = UITapGestureRecognizer(target:self, action: #selector(imageTapped))

und func imageTapped() {}

+0

Ja, das ist etwas, was ich brauchte sie die ObjtC Aktion so jetzt gestoppt habe ich diese – MNM

+0

et tapGesture = UITapGestureRecognizer (Ziel: Selbst, Aktion: #selector (ClassName.functionName)) – MNM

1

Aktionsteil in dem Initialisierer UITapGestureRecognizer schaffen Mittel, welches Verfahren ausgeführt wird. Und der Aktionsteil bedeutet, wer für diese Aktion verantwortlich ist, wer der Delegierte ist.

verwenden die Gestenerkenner zu initialisieren:

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: Selector("imageTapped:")) 

Bitte beachten Sie den Doppelpunkt : nach dem Namen der Methode (imageTapped). Dies bedeutet, dass der Gestenerkenner die Methode imageTapped aufruft und den Parameter sender übergibt. Dies ist hilfreich, wenn Sie ermitteln möchten, welcher Gestenerkenner ausgelöst wurde. Dies ist sehr nützlich, wenn Sie mehrere Bilder haben, die angetippt werden können, so dass Sie nicht für jedes eine Methode erstellen müssen.

Dann müssen Sie die imageTapped Methode deklarieren:

func imageTapped(sender: UIGestureRecognizer) { 
    print("Image tapped") 
} 

Sie die Funktion ohne Parameter erklären kann als gut zu funktionieren, erklären nur die Funktion, ohne den Sender-Parameter und den Doppelpunkt im Aktionswähler löschen. Jedenfalls empfehle ich, es zu behalten, es kann irgendwo nützlich sein und es ist besser, wenn du es so lernst.