Переопределение метода с селектором 'touchesBegan:withEvent:' имеет несовместимый тип ' (NSSet, UIEvent) - > ()'
Xcode 6.3. В классе, реализующем протокол UITextFieldDelegate, я хотел бы переопределить метод touchesBegan (), чтобы, возможно, скрыть клавиатуру. Если я избегаю ошибки компилятора в спецификации функции, то есть ошибка complier, пытающаяся прочитать "прикосновение" из набора или NSSet, или же super.touchesBegan (touches , withEvent:event) выдает ошибку. Одна из таких комбинаций скомпилирована в Xcode 6.2! (Итак, где находится документация для Swift " Set " и как получить элемент из один?)
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)
}
попробуй:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
ошибка компилятора :
Переопределение метода с селектором 'touchesBegan:withEvent:' имеет несовместимый тип ' (NSSet, UIEvent) - > ()'
и
super.touchesBegan(touches , withEvent:event)
также жалуется
'' не может быть неявно преобразован в 'набор'; Вы имели в виду использовать 'как', чтобы явно преобразовать?
попробуй:
override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent)
ошибка компилятора :
Тип 'AnyObject' не соответствует протоколу 'Hashable'
попробуй:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
ошибка компилятора в
if let touch = touches.anyObject() as? UITouch
' Set ' не имеет члена с именем 'anyObject', но спецификация функции и вызов super () в порядке!
попробуй:
override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent)
ошибка компилятора :
Не специализируется не универсального типа NSSet'
8 ответов:
Swift 1.2 (Xcode 6.3) ввел уроженца
Setтип мостов сNSSet. Это упоминается в Swift blog и в в Xcode 6.3 примечания к выпуску,но видимо еще не добавлено в официальную документацию(обновление: как Ахмад Гадири отметил, это и теперь документально).The
UIResponderметод объявлен какfunc touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)и вы можете переопределить это вот так:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { if let touch = touches.first as? UITouch { // ... } super.touchesBegan(touches , withEvent:event) }обновление для Swift 2 (Xcode 7): (ср. переопределить ошибку func в Swift 2)
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first { // ... } super.touchesBegan(touches, withEvent:event) }обновление для Swift 3:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { // ... } super.touchesBegan(touches, with: event) }
С xCode 7 и swift 2.0 используйте следующий код:
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) }
С помощью Swift 3 и 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> }
теперь он находится в справочнике API Apple здесь и для переопределения в xCode версии 6.3 и swift 1.2 вы можете использовать этот код:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { if let touch = touches.first as? UITouch { // ... } // ... }
текущий прямо сейчас для последнего обновления с xCode 7.2 Swift 2.1 на 19 декабря 2015 года.
в следующий раз, когда вы снова получите такую ошибку, удалите функцию и начните вводить ее снова "touchesBe..."и xCode должен автоматически завершить его до самого нового для вас, а не пытаться исправить старый.
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. } }
то, что сработало для меня было:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { if let touch = touches.first as? UITouch { // ... } super.touchesBegan(touches , withEvent:event!) }
маленькое дополнение. Для быстрого компиляции без ошибок, вам нужно добавить
импорт UIKit.UIGestureRecognizerSubclass
С помощью Swift 4 и Xcode 9
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { }
Comments