Xcode8ドラッグアンドコネクト@IBActionが接続インスペクターIBに「WithSender」を誤って追加する
したがって、メソッドの名前を次のような名前に変更する必要があります
@IBAction func tappedConfirmButtonWithSender(sender:AnyObject){}
すべきではないですか?:
@IBAction func tappedConfirmButton(sender:AnyObject){}
これは私のせいですか、それともバグですか?
私もこれをヒットしました。 Swift 3が少し漏れているため、レガシーSwift 2.3コードのバグのようです。重要な答えを見つけました 開発フォーラムで 、および私と私の同僚によるいくつかの追加の調査結果。
回避策:引数(sender: AnyObject)
を(_ sender: AnyObject)
に変更します。変更された行には、無視しても問題のない警告が表示されます。
[UPDATED-別の回避策:Appleは私のバグレポートに応答し、別の回避策を提案しました:@IBAction
メソッドに注釈を付けます@objc
を使用します。それが機能することはまだ確認していません。]
何が起こっているのか:Xcode8ストーリーボードにバグがあるようです。私の解釈では、誤ってSwift 2 @ IBActionメソッドをSwift 3であるかのように解析し、それらをSwift2に変換しようとしています。
詳細にしましょう! Swift 3では、Swift 2とは異なり、次のように宣言されたメソッドが与えられます。
@IBAction func foo(sender: AnyObject)
sender
引数ラベルは実際にはメソッド名の一部であり、そのメソッドの呼び出しに含まれます。もちろん、Swift 2では、最初の引数はデフォルトでラベルを取得しません。 Swift 2では、foo(myButton)
と呼びます。 Swift 3では、foo(sender: myButton)
と呼びます。
Xcode 8は、この関数を誤ってSwift3の方法で読み取っています。また、APIのグランドリネームのパターンは、doSomethingWithParam(quuz)
形式のSwift2メソッド名がSwift3に対してdoSomething(param: quuz)
として書き換えられることです。 Xcodeはそれがここで起こったことを想定しているため、元のSwift 2名を誤って導き出そうとすると、メソッド名の末尾にWithSender
が追加されます。アンダースコアの回避策は、Swift3メソッドのシグネチャをSwift2のシグネチャと同じにすることで機能します。 (Appleによれば、なぜ@objc
アノテーションも問題を解決するのかわかりません。)
[回避策を変更して繰り返し編集しました。]
私はついに私が抱えている問題のトピックを見つけました。私は自分自身を疑うようになりました。
興味のある方のために、もう1つの回避策を提案します。
右クリックしてストーリーボードを開きます-> [名前を付けて開く]-> [ソースコード]。
Xmlファイルでメソッドを見つけ、WithSenderの追加を削除して、メソッド名をクラスのメソッド名と一致させます。
このようにして、メソッド名を好きなように付けることができます。
それでおしまい...
次のように変更してみてください。
@IBAction func tappedConfirmButton(_ sender: AnyObject)
{
}
幸運を!