Переопределение метода с селектором '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'

589   8  

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

    Ничего не найдено.