2015-02-27 2 views
66

Xcode 6.3. Внутри класса, реализующего протокол UITextFieldDelegate, я хотел бы переопределить метод touchhesBegan(), чтобы скрыть клавиатуру. Если я избегаю ошибки компилятора в spec функции, то возникает ошибка с интегратором, пытающаяся прочитать «касание» из набора или NSSet, иначе super.touchesBegan (касается, withEvent: event) выдает ошибку. Одна из этих комбинаций скомпилирована в Xcode 6.2! (Так где документация Swift "Установить" и как получить элемент из одного?)Метод переопределения с касаниями SelectorBegan: withEvent: 'имеет несовместимый тип' (NSSet, UIEvent) ->() '

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

Try:

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) 

также жалуется

«NSSet» неявно конвертируется в «Set»; вы хотели использовать «как» для явного преобразования?

Try:

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

Ошибка компилятора: Тип 'AnyObject' не соответствует протоколу 'Hashable'

Try:

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

Compiler ошибка при

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

'Set' не имеет члена с именем 'anyObject', но функция spec и вызов super() в порядке!

Try:

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

Ошибка компилятора: не может специализироваться необщего типа 'NSSet'

ответ

153

Swift 1.2 (Xcode 6.3) ввел нативную Set типа, мосты с NSSet. Об этом говорится в Swift blog и в Xcode 6.3 release notes, но, видимо, еще не добавлены в официальной документации (обновление: Как Ahmad Ghadiri noted, это является документированы в настоящее время).

Метод 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): (Сравнить 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) 
} 

Обновление для Swift 3:

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

Да! Я тоже прочитаю блог. Спасибо. – SoCor

+0

Спасибо Мартин Р, все, что мне нужно было сделать, это изменить мой NSSet для установки и мой код работает. – MwcsMac

+1

Привет @Martin Почему 'super.touchesBegan (касается, withEvent: event)' нужен? Я до сих пор не понимаю Swift очень хорошо. –

4

То, что сработало для меня было:

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

     super.touchesBegan(touches , withEvent:event!) 
    } 
+0

Если вы находитесь на Xcode 6.3 и Swift 1.2, ваш код не будет работать. Это сообщение, если вы ссылаетесь на Xcode 6.3 и Swift 1.2. – MwcsMac

+1

Вы правы, я обновил Xcode сегодня, и он сразу же дал ошибку. – jfredsilva

6

Теперь в справочнике API Apple, here и переопределение в Xcode версии 6.3 и стремительной 1.2 вы можете использовать это код:

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

Интересно, что онлайн-документы правильные, но версия, входящая в систему справки Xcode, устарела. Наверное, мне нужно привыкнуть искать этот материал в Интернете. –

6

в настоящее время один прямо сейчас для нового обновления по состоянию на Xcode 7.2 Swift 2.1 19 декабря, 2015.

В следующий раз, когда вы снова получите ошибку, удалите эту функцию и начните вводить ее снова «touchhesBe ...», а 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. 
    } 
} 
9

С Xcode 7 и быстрой 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) 
} 
+0

Я не могу построить проект. Получение ошибки * Метод не отменяет какой-либо метод из его суперкласса * для функции 'touchhesBegan'. Я попытался создать подкласс из 'UIGestureRecognizer' и' UTapGestureRecognizer'.Xcode 7.1 –

+0

используйте этот http://stackoverflow.com/questions/30892254/override-func-error-in-swift-2, чтобы проверить, что происходит с вашим кодом. –

3

Небольшое дополнение. Для быстры, чтобы скомпилировать без ошибок, вам нужно добавить

импорт UIKit.UIGestureRecognizerSubclass

8

Использование 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> 
} 
Смежные вопросы