Xcode 6.3。 UITextFieldDelegateプロトコルを実装するクラス内で、touchesBegan()メソッドをオーバーライドしてキーボードを非表示にする場合があります。関数仕様でコンパイラエラーを回避すると、SetまたはNSSetから「タッチ」を読み取ろうとするコンパイラエラーが発生するか、super.touchesBegan(touches、withEvent:event)がエラーをスローします。 Xcode 6.2でコンパイルされたこれらの組み合わせの1つ! (それでは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)
また文句を言う
「NSSet」は「Set」に暗黙的に変換できません。 「as」を使用して明示的に変換するつもりでしたか?
試してください:
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'を特殊化できません
Swift 1.2(Xcode 6.3)は、Set
とブリッジするネイティブのNSSet
タイプを導入しました。これは Swiftブログ および Xcode 6.3リリースノート で言及されています。 しかし、どうやら公式文書にはまだ追加されていないようです (更新: Ahmad Ghadiri指摘 として、それはは現在文書化されています)。
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):(比較 Swiftのfuncエラーを上書き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および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>
}
XCode 7.2 _2015年12月19日にリリースされた最新の更新プログラムの現在の最新バージョンSwift 2.1.
次回このようなエラーが発生した場合は、関数を削除して「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.
}
}
これはApple APIリファレンスにあります here で、xCodeバージョン6.3およびSwift 1.2でオーバーライドするには、次のコードを使用できます。
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
// ...
}
// ...
}
小さな追加。 Swiftをエラーなしでコンパイルするには、追加する必要があります
インポートUIKit.UIGestureRecognizerSubclass
私のために働いたのは:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch {
// ...
}
super.touchesBegan(touches , withEvent:event!)
}
Swift 4およびXcode 9の使用
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}