web-dev-qa-db-fra.com

Xcode 8 glissez et connectez @IBAction ajoute incorrectement "WithSender" à l'inspecteur de connexion IB

Xcode 8 glissez et connectez @IBAction ajoute incorrectement "WithSender" à l'inspecteur de connexion IB

Par conséquent, je dois renommer les méthodes en quelque chose comme

@IBAction func tappedConfirmButtonWithSender (expéditeur: AnyObject) {}

Cela ne devrait-il pas être ?:

@IBAction func tappedConfirmButton (expéditeur: AnyObject) {}

Est-ce ma faute ou est-ce un bug?

15
moyoteg

Je viens juste de frapper ça aussi. Il semble s'agir d'un bogue avec le code Swift 2.3 hérité, en raison d'un peu de fuite de Swift 3. J'ai trouvé les réponses clés dans les forums de développement , ainsi que quelques découvertes supplémentaires de ma part et de mon collègue.

Solution de contournement: Modifiez l'argument (sender: AnyObject) en (_ sender: AnyObject). Vous obtenez un avertissement sur la ligne modifiée que vous pouvez ignorer en toute sécurité.

[ UPDATED - autre solution de contournement: Apple a répondu à mon rapport de bogue et a suggéré une solution de contournement différente: annotez la méthode @IBAction avec @objc. Je n'ai pas encore confirmé que cela fonctionne.]

Que se passe-t-il: On dirait qu'il y a un bogue dans les storyboards Xcode 8 Mon interprétation est qu’elle analyse par erreur les méthodes Swift 2 @IBAction comme si elles étaient Swift 3, puis tente de les reconvertir en Swift 2.

Soyons détaillés! Dans Swift 3, contrairement à Swift 2, une méthode déclarée comme étant:

@IBAction func foo(sender: AnyObject)

le libellé de l'argument sender fait en réalité partie du nom de la méthode et est inclus dans les appels à cette méthode. Dans Swift 2, bien sûr, le premier argument ne reçoit pas d'étiquette par défaut. Dans Swift 2, vous appelez foo(myButton); dans Swift 3, vous appelez foo(sender: myButton).

Xcode 8 lit cette fonction par erreur dans les 3 sens de Swift. Et le modèle pour le changement de nom générique des API est que les noms de méthode Swift 2 de la forme doSomethingWithParam(quuz) sont réécrits pour Swift 3 sous la forme doSomething(param: quuz). Xcode suppose que c'est ce qui s'est passé ici. Par conséquent, dans une tentative peu judicieuse de dériver le nom d'origine de Swift 2, il ajoute WithSender à la fin du nom de la méthode. La solution de contournement fonctionne en rendant la signature de méthode Swift 3 identique à celle de Swift 2. (Je ne sais pas pourquoi l'annotation @objc résout également le problème, selon Apple.)

[Édité à plusieurs reprises avec des modifications aux solutions de contournement.]

31
robotpie

J'ai enfin trouvé le sujet avec le problème que j'ai. J'ai commencé à douter de moi.

Je proposerai une solution supplémentaire pour ceux qui sont intéressés.

Ouvrez votre storyboard avec un clic droit -> Ouvrir en tant que -> Code source.

Recherchez votre méthode dans un fichier xml et supprimez l’ajout WithSender pour faire correspondre le nom de votre méthode à celui de votre classe.

De cette façon, vous pouvez nommer votre méthode comme vous le souhaitez.

C'est tout...

1
Sinisa Vukovic

Vous pouvez essayer de le changer comme suit:

@IBAction func tappedConfirmButton(_ sender: AnyObject) 
{

}

Bonne chance!

0
Lin

J'ai eu le même problème lorsque je travaillais avec Xcode 8. It may be bug.

 Screenshot 1

Vous trouverez ci-dessous une solution pour ce problème:

  1. Delete the outlet connection du fichier IB

  2. Créez un new outlet par Ctrl et faites-le glisser. Cela ouvre une fenêtre contextuelle comme indiqué ci-dessous.

 Screenshot 2

Sélectionnez Connection en tant que Action et entrez name of action. Puis sélectionnez Type.

  1. Appuyez sur Connect. Cela créera un nouvel IBAction dans votre fichier Swift. Bien que le cercle pour IBAction ne soit pas rempli, il est connecté.

 Screenshot 4

0
Jayprakash Dubey