webentwicklung-frage-antwort-db.com.de

Überschreibungsmethode mit dem Selektor 'touchesBegan: withEvent:' hat inkompatiblen Typ '(NSSet, UIEvent) -> ()'

Xcode 6,3. In einer Klasse, die das UITextFieldDelegate-Protokoll implementiert, möchte ich die touchesBegan () - Methode überschreiben, um die Tastatur möglicherweise auszublenden. Wenn ich einen Compiler-Fehler in der Funktionsspezifikation vermeide, gibt es einen komplizierteren Fehler beim Versuch, den "Touch" aus dem Set oder NSSet zu lesen, oder der super.touchesBegan (berührt, withEvent: event) gibt einen Fehler aus. Eine dieser Kombinationen in Xcode 6.2! (Also wo ist die Dokumentation zu Swift "Set" und wie erhält man ein Element von 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) 

Compiler-Fehler: Überschreibungsmethode mit dem Selektor 'touchesBegan: withEvent:' hat einen inkompatiblen Typ '(NSSet, UIEvent) -> ()' Und

super.touchesBegan(touches , withEvent:event)

beschwert sich auch

'NSSet' kann nicht implizit in 'Set' konvertiert werden. Wolltest du "as" verwenden, um explizit zu konvertieren?

Versuchen:

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

Compiler-Fehler: 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 Member namens 'anyObject', ABER die Funktionsangabe und der Aufruf von super () sind in Ordnung!

Versuchen:

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

Compiler-Fehler: Nicht generischer Typ 'NSSet' kann nicht spezialisiert werden

72
SoCor

Mit Swift 1.2 (Xcode 6.3) wurde ein systemeigener Set -Typ eingeführt, der mit NSSet überbrückt. Dies wird im Swift-Blog und in den Xcode 6.3-Versionshinweisen erwähnt. aber anscheinend noch nicht in die offizielle Dokumentation aufgenommen (Update: Wie Ahmad Ghadiri notierte , es ist jetzt dokumentiert).

Die Methode UIResponder 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): (Compare Override func error 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)
}
161
Martin R

Verwenden Sie für xCode 7 und Swift 2.0 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)
}
10

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>
}
9

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

Wenn Sie beim nächsten Mal wieder eine solche Fehlermeldung erhalten, entfernen Sie die Funktion und geben Sie sie erneut ein "touchesBe ...". XCode sollte sie automatisch auf den neuesten Stand bringen, anstatt den alten zu reparieren.

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.
    }
}
6
Jose Ramirez

Es ist 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 {
         // ...
    }
    // ...
}
6
Ahmad Ghadiri

Kleiner Zusatz. Damit Swift ohne Fehler kompilieren kann, müssen Sie hinzufügen

importieren Sie UIKit.UIGestureRecognizerSubclass

4
beshio

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!)
    }
4
jfredsilva

Swift 4 und Xcode 9

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

}
0
ammar shahid