Überschreibende Methode mit Selektor 'touchBegan: withEvent:' hat inkompatiblen Typ '(NSSet, UIEvent) -> ()'

77

Xcode 6.3. Innerhalb einer Klasse, die das UITextFieldDelegate-Protokoll implementiert, möchte ich die touchBegan () -Methode überschreiben, um möglicherweise die Tastatur auszublenden. Wenn ich einen Compilerfehler in der Funktionsspezifikation vermeide, gibt es einen kompatiblen Fehler beim Versuch, die "Berührung" aus dem Set oder NSSet zu lesen, oder das super.touchesBegan (Berührungen, mit Ereignis: Ereignis) löst einen Fehler aus. Eine dieser in Xcode 6.2 kompilierten Kombinationen! (Wo ist also die Dokumentation zu Swift "Set" und wie erhält man ein Element aus einem?)

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    // Hiding the Keyboard when the User Taps the Background
        if let touch =  touches.anyObject() as? UITouch {
            if nameTF.isFirstResponder() && touch.view != nameTF {
                nameTF.resignFirstResponder();
            }
        }
        super.touchesBegan(touches , withEvent:event)
    }

Versuchen:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) 

Compilerfehler: Überschreibende Methode mit Selektor 'touchBegan: withEvent:' hat inkompatiblen Typ '(NSSet, UIEvent) -> ()' und

super.touchesBegan(touches , withEvent:event)

beschwert sich auch

'NSSet' kann nicht implizit in 'Set' konvertiert werden. Wollten Sie 'as' verwenden, um explizit zu konvertieren?

Versuchen:

override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent) 

Compilerfehler: Typ 'AnyObject' entspricht nicht dem Protokoll 'Hashable'

Versuchen:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

Compilerfehler bei

if let touch = touches.anyObject() as? UITouch 

'Set' hat kein Mitglied namens 'anyObject', ABER die Funktionsspezifikation und der Aufruf von super () sind OK!

Versuchen:

override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent) 

Compilerfehler: Nicht generischer Typ 'NSSet' kann nicht spezialisiert werden.

SoCor
quelle

Antworten:

161

Swift 1.2 (Xcode 6.3) führte einen nativen SetTyp ein, der eine Brücke schlägt NSSet. Dies ist in dem genannten Swift Blog und in den Xcode 6.3 Release Notes , aber anscheinend noch nicht auf der offiziellen Dokumentation hinzugefügt (Update: Wie Ahmad Ghadiri bemerkt , es ist dokumentiert jetzt).

Die UIResponderMethode wird jetzt als deklariert

func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)

und Sie können es so überschreiben:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
        // ...
    }
    super.touchesBegan(touches , withEvent:event)
}

Update für Swift 2 (Xcode 7): (Vergleiche Override-Funktionsfehler in Swift 2 )

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, withEvent:event)
}

Update für Swift 3:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, with: event)
}
Martin R.
quelle
Danke Martin R, alles was ich tun musste war mein NSSet auf Set <NSObject> zu ändern und mein Code funktioniert.
MwcsMac
1
Hi @Martin Warum super.touchesBegan(touches , withEvent:event)ist das nötig? Ich verstehe Swift immer noch nicht sehr gut.
Zigii Wong
Ich denke, es muss so sein: super.touchesBegan (berührt, mit Ereignis: Ereignis!) Für xCode 7.2
Eugene Gordin
@EugeneGordin: Warum denkst du so? Die letzte Methode wird noch mit Xcode 7.2 kompiliert.
Martin R
es hat sich für mich beschwert ... Wert des optionalen Typs nicht ausgepackt
Eugene Gordin
10

Verwenden Sie mit xCode 7 und Swift 2.0 den folgenden Code:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch =  touches.first{
        print("\(touch)")
    }
    super.touchesBegan(touches, withEvent: event)
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesEnded(touches, withEvent: event)
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesMoved(touches, withEvent: event)
}
Himanshu Mahajan
quelle
Ich kann das Projekt nicht erstellen. Fehler erhalten Methode überschreibt keine Methode aus ihrer Oberklasse für die touchesBeganFunktion. Ich habe versucht, von UIGestureRecognizerund zu unterklassifizieren UTapGestureRecognizer. Xcode 7.1
Boris Y.
Verwenden Sie diese stackoverflow.com/questions/30892254/… , um zu überprüfen, was mit Ihrem Code los ist
Himanshu Mahajan
10

Verwenden von Swift 3 und Xcode 8

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
// Don't forget to add "?" after Set<UITouch>
}
Chetan Prajapati
quelle
6

Es befindet sich jetzt in der Apple API-Referenz hier und zum Überschreiben in xCode Version 6.3 und Swift 1.2 können Sie diesen Code verwenden:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch =  touches.first as? UITouch {
         // ...
    }
    // ...
}
Ahmad Ghadiri
quelle
Interessant, dass die Online-Dokumente korrekt sind, die im Xcode-Hilfesystem enthaltene Version jedoch veraltet ist. Ich muss mir wohl angewöhnen, online nach diesem Zeug zu suchen.
Duncan C
6

Das aktuelle Update für das neueste Update ab xCode 7.2 Swift 2.1 am 19. Dezember 2015.

Wenn Sie das nächste Mal eine solche Fehlermeldung erhalten, entfernen Sie die Funktion und geben Sie sie erneut ein. "TouchBe ...". XCode sollte sie automatisch auf die neueste für Sie vervollständigen, anstatt zu versuchen, die alte zu beheben.

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch: AnyObject! in touches {
        let touchLocation = touch.locationInNode(self)

        //Use touchLocation for example: button.containsPoint(touchLocation) meaning the user has pressed the button.
    }
}
Jose Ramirez
quelle
4

Was für mich funktioniert hat war:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        if let touch = touches.first as? UITouch {
            // ...
        }

        super.touchesBegan(touches , withEvent:event!)
    }
jfredsilva
quelle
Wenn Sie mit Xcode 6.3 und Swift 1.2 arbeiten, funktioniert Ihr Code nicht. Dieser Beitrag bezieht sich auf Xcode 6.3 und Swift 1.2.
MwcsMac
1
Sie haben Recht, ich habe Xcode heute aktualisiert und es gab sofort einen Fehler.
jfredsilva
4

Kleine Ergänzung. Damit Sie schnell und ohne Fehler kompilieren können, müssen Sie hinzufügen

Importieren Sie UIKit.UIGestureRecognizerSubclass

beshio
quelle
1

Verwenden von Swift 4 und Xcode 9

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}
Ammar Shahid
quelle
0
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        if let touch = touches.first as? UITouch {

            if touch.view == self.view{
                self.dismiss(animated: true, completion: nil)
            }
        }
    }
Talha Rasool
quelle
2
Fügen Sie Kommentare hinzu, erklären Sie Ihre Antwort und lesen Sie, wie Sie antworten .
Aksen P