web-dev-qa-db-ja.com

Xcode8ドラッグアンドコネクト@IBActionが接続インスペクターIBに「WithSender」を誤って追加する

Xcode8ドラッグアンドコネクト@IBActionが接続インスペクターIBに「WithSender」を誤って追加する

したがって、メソッドの名前を次のような名前に変更する必要があります

@IBAction func tappedConfirmButtonWithSender(sender:AnyObject){}

すべきではないですか?:

@IBAction func tappedConfirmButton(sender:AnyObject){}

これは私のせいですか、それともバグですか?

15
moyoteg

私もこれをヒットしました。 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アノテーションも問題を解決するのかわかりません。)

[回避策を変更して繰り返し編集しました。]

31
robotpie

私はついに私が抱えている問題のトピックを見つけました。私は自分自身を疑うようになりました。

興味のある方のために、もう1つの回避策を提案します。

右クリックしてストーリーボードを開きます-> [名前を付けて開く]-> [ソースコード]。

Xmlファイルでメソッドを見つけ、WithSenderの追加を削除して、メソッド名をクラスのメソッド名と一致させます。

このようにして、メソッド名を好きなように付けることができます。

それでおしまい...

1
Sinisa Vukovic

次のように変更してみてください。

@IBAction func tappedConfirmButton(_ sender: AnyObject) 
{

}

幸運を!

0
Lin

Xcode8での作業中に同じ問題が発生しました。It may be bug.

Screenshot 1

以下は、この問題の回避策です。

  1. Delete the outlet connectionIBファイルから

  2. Ctrlキーを押しながらドラッグしてnew outletを作成します。これにより、以下に示すようなポップアップが開きます。

Screenshot 2

[接続]をActionとして選択し、name of actionと入力します。次に、Typeを選択します。

  1. Connectを押します。これにより、Swiftファイルに新しいIBActionが作成されます。IBActionの円は塗りつぶされていない可能性がありますが、接続されています。

Screenshot 4

0